欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)12864滾動(dòng)顯示程序,有什么方法能實(shí)現(xiàn)不到四行也能滾屏顯示嗎?
[打印本頁(yè)]
作者:
鮑勃
時(shí)間:
2021-1-10 11:12
標(biāo)題:
單片機(jī)12864滾動(dòng)顯示程序,有什么方法能實(shí)現(xiàn)不到四行也能滾屏顯示嗎?
按網(wǎng)上的源碼能實(shí)現(xiàn)整屏滾動(dòng),有什么方法能實(shí)現(xiàn)不到四行也能滾屏顯示嗎?求大佬指導(dǎo)一下
#define uchar unsigned char
#define uint unsigned int
uchar code SJ[]={"蒹葭蒼蒼,白露為霜需謹(jǐn)慎再創(chuàng)造出來的歷程都快來吃多了,段時(shí)間看好大好大很好的克拉克拉 "};
/*12864端口定義*/
#define LCD_data P0 //數(shù)據(jù)口
sbit RS = P3^5; //寄存器選擇輸入
sbit RW = P3^6; //液晶讀/寫控制
sbit EN = P3^4; //液晶使能控制
sbit PSB = P3^1; //串/并方式控制
sbit DU =P2^6;
sbit WE = P2^7;
void delay5us()//5us延時(shí)
{;;}
void delay(uint z) //毫秒延時(shí)程序
{
unsigned char a,b;
uint c;
for(c=z+7;c>0;c--)
for(b=197;b>0;b--)
for(a=2;a>0;a--);
}
void check_busy()//判忙
{
uchar busy;
P0=0xff;
RS=0;
RW=1;
do
{
EN=1;
busy=P0;
EN=0;
}while(busy&0x80);
EN=0;
}
void lcdw_dat(uchar dat)//寫入數(shù)據(jù)
{
check_busy();
RS=1;
RW=0;
EN=0;
delay5us();
P0=dat;
delay5us();
EN=1;
delay5us();
EN=0;
}
void lcdw_cmd(uchar cmd)//寫入指令
{
check_busy();
RS=0;
RW=0;
EN=0;
delay5us();
P0=cmd;
delay5us();
EN=1;
delay5us();
EN=0;
}
void lcdinit()
{
DU=0;
WE=0;
PSB = 1; //并口方式
lcdw_cmd(0x34); //擴(kuò)充指令操作
delay(5);
lcdw_cmd(0x30); //基本指令操作
delay(5);
lcdw_cmd(0x0C); //顯示開,關(guān)光標(biāo)
delay(5);
lcdw_cmd(0x01); //清除LCD的顯示內(nèi)容
delay(5);
}
void main()
{
unsigned char i,addr;
unsigned char flag,hang,over;
unsigned char *ptdat;
lcdinit();
//addr用于存儲(chǔ)寫入地址
//flag存儲(chǔ)卷動(dòng)地址,名字沒取好!
//hang存儲(chǔ)下一行要寫入數(shù)據(jù)的行號(hào)(1~4)
//over記錄寫入的空字符數(shù)
//ptdat存儲(chǔ)字符串的指針
delay(1);
ptdat = &SJ[0];
over = 0; //寫入空字符數(shù)
//這里先把前面DDRAM中的前3行的字符數(shù)據(jù)寫入
//如果字符不足<=4行,那么不卷動(dòng),之后字符>4行才卷動(dòng)
//一直到末行顯示完畢則停止卷動(dòng)
lcdw_cmd(0x80); //寫屏幕第一行字符
for(i = 0; i < 16; i++)
{
if(*ptdat != '\0')
{
lcdw_dat(*ptdat++);
}
else
{
lcdw_dat(0x20);
over++;
}
}
lcdw_cmd(0x90); //寫屏幕第二行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
lcdw_dat(*ptdat++);
}else{
lcdw_dat(0x20);
over++;
}
}
lcdw_cmd(0x88);//寫屏幕第三行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
lcdw_dat(*ptdat++);
}else{
lcdw_dat(0x20);
over++;
}
}
lcdw_cmd(0x98);//寫屏幕第四行字符
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
lcdw_dat(*ptdat++);
}else{
lcdw_dat(0x20);
over++;
}
}
ptdat = ptdat - 32;
lcdw_cmd(0xa0); //寫DDRAM第3行數(shù)據(jù)
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
lcdw_dat(*ptdat++);
}else{
lcdw_dat(0x20);
over++;
}
}
ptdat = ptdat + 16;
for(i = 0; i < 16; i++){
if(*ptdat != '\0'){
lcdw_dat(*ptdat++);
}else{
lcdw_dat(0x20);
over++;
}
}
//前面的代碼是往DDRAM中寫如下內(nèi)容:
//第一行字符 第三行字符
//第二行字符 第四行字符
//第三行字符 第五行字符
//如果寫第5行時(shí)全為空,說明字符剛好4行,不卷動(dòng)。
//此時(shí)第5行寫入16個(gè)0x20空字符,over用于記錄空字符個(gè)數(shù)。
//如果不足4行,則前面也將會(huì)寫入空字符,此時(shí)寫完了3行DDRAM后
//over的值必大于16,而只要over>15,就不卷動(dòng)
lcdw_cmd(0x0c); //開顯示
if(over > 15){;} //顯示字符不足4行,不卷動(dòng)
else //顯示字符大于4行,開啟卷動(dòng)
{
hang = 4; //接下來要寫DDRAM第4行數(shù)據(jù)
flag = 0x01; //初始卷動(dòng)地址為1
while(1){
switch(hang){ //設(shè)置寫入DDRAM的地址
case 1: addr = 0x80; break; //往地址變量中寫第一行首地址
case 2: addr = 0x90; break; //往地址變量中寫第二行首地址
case 3: addr = 0xa0; break; //往地址變量中寫第三行首地址
case 4: addr = 0xb0; break; //往地址變量中寫第四行首地址
}
switch(hang){ //指出下一次要寫的行地址
case 1: hang = 2; break;//第1行寫完了,下一行要寫第2行
case 2: hang = 3; break;//第2行寫完了,下一行要寫第3行
case 3: hang = 4; break;//第3行寫完了,下一行要寫第4行
case 4: hang = 1; break;//第4行寫完了,下一行要寫第1行
}
//后續(xù)代碼為往每一行寫數(shù)據(jù),卷動(dòng)一次寫一個(gè)字。
ptdat = ptdat - 32;
for(i = 0; i < 8; i++)
{ //寫一行中的前8個(gè)字符
lcdw_cmd(0x34); //打開擴(kuò)展指令
lcdw_cmd(0x03); //允許輸入卷動(dòng)地址
lcdw_cmd(0x40 + flag++); //設(shè)置卷動(dòng)地址
lcdw_cmd(0x30); //回到基本指令
lcdw_cmd(addr + i);
delay(100);
if(*ptdat != '\0')
{
lcdw_dat(*ptdat++); //寫入高字節(jié)
}
else
{
lcdw_dat(0x20); //字符串結(jié)束則寫入空字符
}
if(*ptdat != '\0')
{
lcdw_dat(*ptdat++); //寫入低字節(jié)
}
else
{
lcdw_dat(0x20); //字符串結(jié)束則寫入空字符
}
}
ptdat = ptdat + 16;
for(i = 8; i < 16; i++)
{ //寫一行中的后8個(gè)字符
lcdw_cmd(0x34); //打開擴(kuò)展指令
lcdw_cmd(0x03); //允許輸入卷動(dòng)地址
if(flag == 64)
{
flag = 0;
}
lcdw_cmd(0x40 + flag); //設(shè)置卷動(dòng)地址
flag++;
lcdw_cmd(0x30); //回到基本指令
lcdw_cmd(addr + i);
delay(100);
if(*ptdat != '\0')
{
lcdw_dat(*ptdat++); //寫入高字節(jié)
}
else
{
over++; //寫完最后一行字符,需要再卷動(dòng)16次才能顯示出來。
lcdw_dat(0x20); //字符串結(jié)束則寫入空字符
}
if(*ptdat != '\0')
{
lcdw_dat(*ptdat++); //寫入低字節(jié)
}
else
{
lcdw_dat(0x20); //字符串結(jié)束則寫入空字符
}
}
if(over < 8){;}
else {break;}
}
}
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1