欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機+LCD12864怎么讓四行漢字滾動起來?
[打印本頁]
作者:
w18278023119
時間:
2021-12-20 20:41
標題:
單片機+LCD12864怎么讓四行漢字滾動起來?
這是我寫的顯示的代碼,按鍵切換顯示內容,如果我想實現按鍵變成內容滾動,應該怎么寫!
單片機源程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*12864端口定義*/
#define LCD_data P0 //數據口
sbit LCD_RS = P2^6; //寄存器選擇輸入
sbit LCD_RW = P2^5; //液晶讀/寫控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
sbit wela = P2^6;
sbit dula = P2^7;
sbit key =P2^3;
uchar code dis1[] = {"打電話說哈實際上"};
uchar code dis2[] = {"今天星期五"};
uchar code dis3[] = {"哈哈哈哈哈"};
uchar code dis4[] = {"吃米線"};
uchar code dis5[] = {"單片機哈 "};
uchar code dis6[] = {"單片機哈哈"};
uchar code dis7[] = {"單片機哈哈哈"};
uchar code dis8[] = {"單片機哈哈哈哈"};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar IRDIS[2];
uchar IRCOM[4];
void dataconv();
void delay0(uchar x); //x*0.14MS
void lcd_pos(uchar X,uchar Y); //確定顯示位置
/*******************************************************************/
/* */
/* 延時函數 */
/* */
/*******************************************************************/
void delay(uint time)
{
uint x,y;
for(x=time;x;x--)
for(y=110;y;y--);
}
/*******************************************************************/
/* */
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd)
{
lcd_busy();
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
delay(2);
P0 = cmd;
delay(2);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*寫顯示數據到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN =1;
delay(2);
P0 = dat;
delay(2);
LCD_EN = 0;
}
void lcd_init()
{
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //擴充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //顯示開,關光標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}
/*********************************************************/
/* */
/* 延時x*0.14ms子程序 */
/* */
/*********************************************************/
void delay0(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
} //* 設定顯示位置 ******************************************************/
/*void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //顯示地址
}
*/
void print(uchar line,uchar *dis5)
{
uchar code p[4]={0x80,0x90,0x88,0x98};
uchar i;
lcd_wcmd(p[line]);
for(i=0;dis5[i] != '\0';i++)
lcd_wdat(dis5[i]); //顯示字符
}
main()
{
uchar i;
delay(10); //延時
wela=0;
dula=0;
lcd_init(); //初始化LCD
while(1)
{
if(key==0)
{
print(0,dis5);
print(1,dis6);
print(2,dis7);
print(3,dis8);
}
else
{
print(0,dis1);
print(1,dis2);
print(2,dis3);
print(3,dis4);
}
}
}
復制代碼
作者:
188610329
時間:
2021-12-21 00:23
代碼就不給你了, 自己寫是最好的。
如果,內存足夠多, 就在內存中構建出一個假想的屏幕(buffer),屏幕寬度或者高度滿足你需要顯示的內容,把點陣在虛擬的屏幕上(buffer中)解析出來, 然后,所謂的屏幕滾動,就是就是把虛擬屏幕的內容,映射到真實屏幕上的時候,按一定時間的間隔, 改變虛擬屏幕(buffer)的起始坐標。
作者:
最后的sixgods
時間:
2021-12-21 08:58
用循環的方式來,按照你設定的時間,比如,第一次第一個字符顯示在第一行第一列,那么寫下一次,全部字符往你想要方向移動就好了
作者:
名字不是重點
時間:
2021-12-21 10:12
有個萬能的方法,比較粗暴,但很有效:
比如采用7920的12864屏,
如果是按字符方式,上下滾動,則頁坐標+2或-2,左右滾動,則列坐標+1或-1
如要是按圖形方式,上下滾動,則Y坐標+或-你想要的步進,最小是1,左右滾動,則X坐標+或-你想要的步進,最小也是1。
按一定的時間更改坐標,并刷新顯示,你的屏幕就動起來了。很簡單的。
不過,7920的擴展指令支持“卷屏”,可以直接選擇地址,省去刷顯這個動作,也是很好的方法以。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1