单片机12864 c程序-msp430与12864连接驱动程序(ks0108)
#i ncludemsp430x14x.h// standard equations
#i ncludemath.h
#i ncludestdlib.h
#i ncludestdio.h
#i ncludestring.h
#i ncludectype.h
#i ncludehztable.h
#i ncludeascii816.h
#define uint unsigned int
#define uchar unsigned char
//**********************************************
#definersbit0
#definerwbit1
#defineebit2
#definecs1bit3
#definecs2bit4
#definerstbit5
#defineelbit6//背光
//数据线:p4口,控制线:p5口
//**********************************************
ucharcradd1,cradd2;
uchar item1[5]={0,1,2,3,50};//欢迎使用
uchar item2[5]={4,5,6,7,50};//请等待……
//=======================================================
void short_delay(uint i)
{ uint j;
for(j=0;j0;i--)
{ for(count=0;count<=58;count++) {;}
_nop();
}
}
//**************************************************
void prl0(uchar com1)// 写指令代码子程序(左)
{
p5dir|=0x7f;//p5为输出口
p5out|=cs1;//csa=1
p5out&=~cs2;//csb=0
p5out&=~rs;
p5out|=rw;//rs=0,r/w=1,以便读液晶状态
p4dir=0x00;//p4口为输入口
do
{
p5out|=e;//e=1
cradd1=p4in;
p5out&=~e;//e=0
}
while((cradd1&0x80)!=0);
p5out&=~rw;//rw=0
p4dir=0xff;//p4口为输出口
p4out=com1;
p5out|=e;//e=1
p5out&=~e;//e=0
}
//**************************************************
void prl1(uchar dat1)// 写显示数据子程序(左)
{
p5dir|=0x7f;//p5为输出口
p5out|=cs1;//csa=1
p5out&=~cs2;//csb=0
p5out&=~rs;
p5out|=rw;//rs=0,r/w=1,以便读液晶状态
p4dir=0x00;//p4口为输入口
do
{
p5out|=e;//e=1
cradd1=p4in;
p5out&=~e;//e=0
}
while((cradd1&0x80)!=0);
p5out|=rs;//rs=1
p5out&=~rw;//rw=0
p4dir=0xff;//p4口为输出口
p4out=dat1;
p5out|=e;//e=1
p5out&=~e;//e=0
}
//**************************************************
void prr0(uchar com2)// 写指令代码子程序(右)
{
p5dir|=0x7f;//p5为输出口
p5out&=~cs1;//csa=0
p5out|=cs2;//csb=1
p5out&=~rs;
p5out|=rw;//rs=0,r/w=1,以便读液晶状态
p4dir=0x00;//p4口为输入口
do
{
p5out|=e;//e=1
cradd1=p4in;
p5out&=~e;//e=0
}
while((cradd1&0x80)!=0);
p5out&=~rw;//rw=0
p4dir=0xff;//p4口为输出口
p4out=com2;
p5out|=e;//e=1
p5out&=~e;//e=0
}
//*************************************************
void prr1(uchar dat2)// 写显示数据子程序(右)
{
p5dir|=0x7f;//p5为输出口
p5out&=~cs1;//csa=0
p5out|=cs2;//csb=1
p5out&=~rs;
p5out|=rw;//rs=0,r/w=1,以便读液晶状态
p4dir=0x00;//p4口为输入口
do
{
p5out|=e;//e=1
cradd1=p4in;
p5out&=~e;//e=0
}
while((cradd1&0x80)!=0);
p5out|=rs;//rs=1
p5out&=~rw;//rw=0
p4dir=0xff;//p4口为输出口
p4out=dat2;
p5out|=e;//e=1
p5out&=~e;//e=0
}
//****************************************************
//读显示数据子程序(左屏)
//****************************************************
uchar readdatal(void)
{
uchar rdata;
p5dir|=0x7f;//p5为输出口
p5out|=cs1;//csa=1
p5out&=~cs2;//csb=0
p5out&=~rs;
p5out|=rw;//rs=0,r/w=1,以便读液晶状态
p4dir=0x00;//p4口为输入口
do
{
p5out|=e;//e=1
cradd1=p4in;
p5out&=~e;//e=0
}
while((cradd1&0x80)!=0);
p5out|=rs;//rs=1
//p5out|=rw;//r/w=1
p5out|=e;//e=1
rdata=p4in;
p5out&=~e;//e=0
return rdata;
}
//****************************************************
//读显示数据子程序(右屏)
//****************************************************
uchar readdatar(void)
{
uchar rdata;
p5dir|=0x7f;//p5为输出口
p5out&=~cs1;//csa=0
p5out|=cs2;//csb=1
p5out&=~rs;
p5out|=rw;//rs=0,r/w=1,以便读液晶状态
p4dir=0x00;//p4口为输入口
do
{
p5out|=e;//e=1
cradd1=p4in;
p5out&=~e;//e=0
}
while((cradd1&0x80)!=0);
p5out|=rs;//rs=1
//p5out|=rw;//r/w=1
p5out|=e;//e=1
rdata=p4in;
p5out&=~e;//e=0
return rdata;
}
//**********************************************
//**********************************************
void clsr(void)//清屏
{uchar i,j;
for(i=0;i<8;i++)
{prl0(i|0xb8);//设置页地址
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)//设置列地址
{ prl1(0x00);//写0x00
prr1(0x00);
}
}
}
//**********************************************
void allon(void)//满屏
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8);
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0xff);//写0xff
prr1(0xff);
}
}
}
//***********************************************
void stripe(void)
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8);
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0xaa);
prr1(0xaa);// 写0xaa
}
}
}
//***********************************************
void stripe1(void)
{ uchar i,j;
for(i=0;i<8;i++)
{prl0(i|0xb8);
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0x55);// 写0x55
prr1(0x55);
}
}
}
//***************************************************
//***************************************************
void hzw_pr(uchar colum2,ucharpage2,uchar code2)// 写汉字
//page2:页colum2:列code2:代码code2=0,1,2,3……表示第几个汉字
{uchar i,j,colum;
uchar*hzp;
uchar flag;
hzp=&hztable[code2][0];
for(j=0;j63)//右屏
{ colum=colum-64;
prr0(colum|0x40);
flag=1;
}
else//左屏
{prl0(colum|0x40);
flag=0;
}
//*********************
for(i=0;i 0; iq0--); // 延时,等待xt2起振
} while ((ifg1 & ofifg) != 0);// 判断xt2是否起振
bcsctl2 =selm_2+sels;//选择mclk、smclk为xt2,
bcsctl2 |=divm_1;//mclk 2分频smclk=mclk=2mhz
}
//***********************************************
//主程序
//***********************************************
void main(void)
{
uchara;
// uchar i,j;
wdtctl=wdtpw+wdthold;
init_xt2();
p5dir|=0x7f;//p5为输出口
p5out&=~rst;//rst=0
delayms(10);//1ms
p5out|=rst;//rst=1
p5out&=~el;//el=0背光=0
do
{
prl0(0xc0);prr0(0xc0);//显示开始行
prl0(0x3f);prr0(0x3f);//开显示
//p5out&=~el;//el=0背光=0
//******************************************************
clsr();//clear screen
//写汉字字符串1欢迎使用
//写汉字字符串2请等待…
w_hzstr(32,2,item1);w_hzstr(32,5,item2);
delayms(100);
for(a=0;a<50;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
clsr();
allon();//fill screen
delayms(100);
for(a=0;a<25;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
clsr();//clear screen
delayms(100);
for(a=0;a<25;a++)
{ delayms(100);}
/*stripe screen*/
prl0(0xc0);prr0(0xc0);
stripe();
delayms(100);
for(a=0;a<20;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
stripe1();
delayms(100);
for(a=0;a<50;a++)
{ delayms(100);}
}while(1);
}
12864液晶控制程序
//注意字符或图片取模方式为字节倒序,纵向取模
//字模精灵下载
//2005.6.修改了部分显示函数,使用时不再用考虑左右屏
#include lcdriver.h
//lcdriver.c
void delay(long v)
{
while(--v);
}
void write_command(uchar cmdcode,uchar cs1,uchar cs2) //写命令到lcd
{
cs1=(cs1?1:0);
cs2=(cs2?1:0);
di=0;
rw=0;
lcd_data_bus=cmdcode;//写命令
e=0;
delay(1);
e=1;
e=0;
}
void write_data(uchar disp_data,uchar cs1,uchar cs2) //写数据到lcd
{
cs1=(cs1?1:0);
cs2=(cs2?1:0);
di=1;
rw=0;
lcd_data_bus=disp_data;//写显示数据
e=0;
delay(1);
e=1;
e=0;
}
uchar read_data(uchar cs1,uchar cs2)//read data from lcd
{
unsigned char get_data;
cs1=(cs1?1:0);
cs2=(cs2?1:0);
di=1;
rw=1;
e=1;
delay(1);
e=0;
e=1;
e=0;
get_data=lcd_data_bus;
return get_data;
}
void lcd_init() //初始化lcd屏
{
rst=0; //复位 如是上电复位就不用
delay(100);
rst=1;
delay(100);
write_command(disp_off,1,1); //关显示
write_command(row_add+0,1,1);
write_command(start_line+0,1,1); //设置首行为起始行
write_command(col_add+0,1,1);
write_command(disp_on,1,1); //开显示
}
void clr_screen(void)
{
uchar row,col;
for(row=0;row<8;row++)
{
for(col=0;col<128;col++)
{
lcd_row_col_data(row,col,0x00);
}
}
}
/*
void full_screen(void)
{
uchar row,col;
for(row=0;row<8;row++)
{
for(col=0;col<128;col++)
{
lcd_row_col_data(row,col,0xff);
}
}
}
*/
uchar read_lcd_data(uchar row,uchar col)//新增函数 从lcd读取数据
{
uchar get_data;
write_command(row_add+row,1,1);
if(col<64)
{
write_command(col_add+col,1,0);
get_data=read_data(1,0);
}
else
{
write_command(col_add+col-64,0,1);
get_data=read_data(0,1);
}
return get_data;
}
void lcd_dot_disp(uchar x,uchar y)//新增函数 以点形式显示x 0-127; y 0-63 左下角为坐标原点
{
uchar byte_dot[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
if(((x==127)&&(y==0))||(x==126)&&(y==0)||(x==125)&&(y==0)||(x==124)&&(y==0)) //避免显示小图标
return;
write_command(start_line,1,1);
if(y<8)
{
lcd_row_col_data(7,x,byte_dot[y]);
return;
}
else if(y<16)
{
lcd_row_col_data(6,x,byte_dot[y-8]);
return;
}
else if(y<24)
{
lcd_row_col_data(5,x,byte_dot[y-16]);
return;
}
else if(y<32)
{
lcd_row_col_data(4,x,byte_dot[y-24]);
return;
}
else if(y<40)
{
lcd_row_col_data(3,x,byte_dot[y-32]);
return;
}
else if(y<48)
{
lcd_row_col_data(2,x,byte_dot[y-40]);
return;
}
else if(y<56)
{
lcd_row_col_data(1,x,byte_dot[y-48]);
return;
}
else if(y<64)
{
lcd_row_col_data(0,x,byte_dot[y-56]);
return;
}
}
void lcd_row_col_data(uchar row,uchar col,uchar disp_data)//新增函数2005.6 以字节形式显示
{
write_command(row_add+row,1,1);
if(col<64)
{
write_command(col_add+col,1,0);
write_data(disp_data,1,0);
}
else
{
write_command(col_add+col-64,0,1);
write_data(disp_data,0,1);
}
}
void signal_disp(uchar t,uchar on_off) //右上角标志显示
{
write_command(row_add+8,0,1);
write_command(col_add+59+t,0,1);
write_data(on_off?0x80:0x00,0,1);
}
void ch_display(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir) //--指定位置显示字符w*16-////////row*col /////////////max=8*128//2005.6精简
{
uchar j,i=0;
for(j=0;j<2;j++)
{
for(i=0;i
{
if(dir==1)
lcd_row_col_data(j+row,col+i,~ch_data[2*i+j]);//反显
else
lcd_row_col_data(j+row,col+i,ch_data[2*i+j]);//正显
}
}
}
void ch_display_8(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir) //--指定置显示字符///////////
////////w*8---------row*col max=8*128//2005.6精简
{
uchar i=0;
for(i=0;i{
if(dir==1)
lcd_row_col_data(row,col+i,~ch_data[2*i]);//反显
else
lcd_row_col_data(row,col+i,ch_data[2*i]);//正显
}
}
void bmp_display(uchar const *bmp)//2005.6精简 //显示128*64位图
{
uchar j,k;
write_command(start_line,1,1);
for(k=0;k<8;k++)
{
for(j=0;j<128;j++)
lcd_row_col_data(k,j,bmp[8*j+k]);
}
}
//以下程序待检测(430单片机上可以用 )
/*
void fun_display(uchar const *bmp) //动画效果--右移
{
char j,k,x=64;
while(x--)
{
write_command(row_add,1,1);
write_command(col_add,1,1);
for(k=0;k=0;k--)
{
write_command(row_add+k,1,0);
for(j=0;j1023)
write_data(0x00,1,0);// 先要判断是否超出128*64的范围
else
write_data(bmp[8*j+k+x],1,0);
}
write_command(row_add+k,0,1);
for(j=0;j1023) //先要判断是否超出128*64的范围
write_data(0x00,0,1);
else
write_data(bmp[8*j+k+512+x],0,1);
}
}
delay(50000);
}
}
void fun3_display(uchar const *bmp,uint h) //动画--上移 该函数实现了显示大于128*64图象的方法,
{ //现在只能实现显示128*h的图象
char j,k; //并且h为8的倍数
uint a, b,c,x;
x=h-1;
a=h/8;
b=128*a-1;
c=64*a;
while(x--)
{
write_command(col_add,1,1);
for(k=7;k>=0;k--)
{
write_command(row_add+k,1,0);
for(j=0;jb) //x前的系数如为-1则是上移,是+1为下移;
write_data(0x00,1,0); //先要判断是否超出128*h的范围
else
write_data(bmp[a*j+k-x],1,0);
}
write_command(row_add+k,0,1);
for(j=0;jb) //先要判断是否超出128*h的范围
write_data(0x00,0,1);
else
write_data(bmp[a*j+k+c-x],0,1);
}
}
delay(40000) ;
}
}
void fun4_display(uchar const *bmp)
{
char j,k,x=64;
while(x--)
{
write_command(col_add,1,1);
for(k=7;k>=0;k--)
{
write_command(row_add+k,1,0);
for(j=0;j2047)
write_data(0x00,1,0);// 先要判断是否超出128*64的范围
else
write_data(bmp[16*j+k+3*x],1,0);
}
write_command(row_add+k,0,1);
for(j=0;j2047) //先要判断是否超出128*64的范围
write_data(0x00,0,1);
else
write_data(bmp[16*j+k+1024+3*x],0,1);
}
}
delay(10000);
}
}
*/
//上面程序的.h文件
#ifndef lcdriver
#define lcdriver
#include init.h
/*-----------定义寄存器的指令代码----------*/
#define disp_on 0x3f
#define disp_off 0x3e
#define col_add 0x40
#define row_add 0xb8
#define start_line 0xc0
#define signal1 1
#define signal2 2
#define signal3 3
#define signal4 4
#define on 1
#define off 0
#define lcd_data_bus p2
sbit di =p3^1;
sbit rw =p3^3;
sbit e =p3^7;
sbit cs1=p3^4;
sbit cs2=p3^5;
sbit rst=p3^0; //复位
void delay (long v) ;
void write_command(uchar cmdcode,uchar cs1,uchar cs2) ; //写命令到lcd
void write_data(uchar dispdata,uchar cs1,uchar cs2) ; //写数据到lcd
uchar read_data(uchar cs1,uchar cs2); //read data from lcd
void lcd_init(void) ; //初始化lcd屏
void clr_screen(void) ; //清屏
//void full_screen(void); //满屏
uchar read_lcd_data(uchar row,uchar col); //新增函数 读数据从lcd
void lcd_row_col_data(uchar row,uchar col,uchar disp_data); //新增函数 字节形式显示
void signal_disp(uchar t,uchar on_off); //右上角标志显示
void lcd_dot_disp(uchar x,uchar y); //新增函数 以点形式显示 x 0-127; y 0-63 左下角为原点
void ch_display_8(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir);//指定位置显示字符w*8
void ch_display(uchar row, uchar col, uchar const *ch_data,uchar w,uchar dir); //指定位置显示字符w*16
void bmp_display(uchar const *bmp); //显示128*64位图
/*
void fun_display(uchar const *bmp); //动画效果-----右移
void fun2_display(uchar const *bmp); //动画--下移
void fun3_display(uchar const *bmp,uint h) ; //动画--上移//该函数实现了显示大于128*64图象的方法, 现在只能实现显示128*h的图象
void fun4_display(uchar const *bmp);
*/
#endif
2019年DRAM产业用于生产的资本支出总金额约为180亿美元,年减约10%
工业设备远程数据传输-modbus通讯协议/以太网
什么是锂电能量包
一个低功耗的蓝牙智能门锁详细介绍
2018年度第四届“中国好手机颁奖典礼”OPPO包揽榜单前三
单片机12864 c程序
苹果系统iOS10.3更新时间马上到来?
uni-app图片上传实战
苹果原装USB PD充电器被中国工程师成功破解
VR全景相机Insta360 Pro 2,支持录制HDR视频,可实现远距离实时监控
两部门呼吸加大直线马达应用力度
三种种常用的LED闪烁电路
什么是Kubernetes容器运行时CRI
快速靠近开关原理是什么
电化学传感器的使用寿命
华为首次对外解读C-V2X车联网战略 华为回应研发搬迁东莞为扩大规模
贴片头光电式位置传感器
关于建筑能耗监测系统的应用分析
高性能CMOS图像传感器厂商长光辰芯启动IPO
openeuler安装教程一:openeuler安装准备