最近想做一件東西,卻想到一個一直沒有直視的問題,12864只能顯示32個漢字,但如何實現在某個位置上寫上兩個數字呢(不用數組),在網上也很少有這類資料,至少我沒有看到,偶然間在調試1602程序時,發現位置可以自動加1,也就是你定了一個位置,寫上數據后,可以連續寫,如下程序,就實現在在cd_pos(2,0); //第二行第一列地址上顯示45度的字樣,你學會了嗎?
單片機源程序如下:
- #include<reg52.h> //每個程序都 要包含頭文件,
- typedef unsigned char uint8; //聲明定義 ,,同 #define ,但#define要加#號才能使用 ,后不加分號
- typedef unsigned int uint16;
- sbit rs=P2^6;//數據或命令接口
- sbit rw=P2^5; //讀寫接口
- sbit e=P2^7; //使能接口
- sbit PSB=P3^2;
- uint8 code a[]="今天2019年05月11"; //1602只能顯示每行40個字符,多余的無法顯示
- uint8 code b[]="現在天氣真的很熱";//為了標示顯示位置,兩行作為對比 7890
- void delay(uint16 i) //1us
- { uint8 t;
- while(i--)
- {
- for(t=0;t<12;t++) ;
- }
- }
- //寫指令程序
- void write_cmd(uint8 cmd)
- {
- delay(2);
- rs=0; //指令接口
- rw=0; //寫指令
- e=0;
- P0=cmd; //指令傳給IO口
- e=1; //使能端高電平有效,要再拉低結束程序轉送,
- delay(2);
- e=0;
- }
- //寫數據程序
- void write_dat(uint8 dat)
- {
- delay(2);
- rs=1; //數據
- rw=0; //寫
- e=0;
- P0=dat;
- e=1;
- delay(10);
- e=0;
- delay(2); //每寫完一個數據, 延時,這樣顯示慢一點,也決定了移屏的速度
- }
- void init()
- {
- delay(1);
- PSB=1;
- write_cmd(0x30); // 0x30:8位數據總線,基本指令集 設置為位數據總線,單行或雙行顯示
- delay(5); // 0x34:8位數據總線,擴充指令集 可實現翻屏操作
- write_cmd(0x0c); //0X0f:光標顯示及閃爍 0X0c:光標不顯示及不閃爍
- delay(5); //0X0e: 光標顯示,不閃爍 0x0d:光標不顯示閃爍
- //同1602
- write_cmd(0x01); //清屏顯示
- delay(5);
- }
- void lcd_pos(uint8 x,uint8 y) //位置函數,非常重要,顯示第幾行,幾列
- {
- uint8 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; //第幾的第幾個位置,,所以要相加,相當于第1行的第Y列的,Y,的位置就要定為X+Y
- write_cmd(pos);
- }
- void display()
- {
- uint8 i;
-
- lcd_pos(0,0); //第一行第一列地址,若要空降某一地址,寫上即可
- for(i=0;i<16;i++) //設置 80個字符顯示,第一行顯示完,自動在第二行顯示
- {
- write_dat(a[i]); //用了數組 ,就要以直接寫顯示 的字符,否者字符要加單引號''
- }
- //單獨顯示某一個字時必須寫上對應的十六 進制編碼;不要
- //不能直接寫上
- lcd_pos(1,0); //第二行第一列地址
- for(i=0;i<16;i++)
- {
- write_dat(b[i]);
- }
- lcd_pos(2,0); //第二行第一列地址
- write_dat('4') ; //顯示45 度
- write_dat('5') ;
- write_dat(0XA1); // 兩個度字節顯示0C
- write_dat(0xe6); //
- }
- void main()
- {
- init();
- while(1)
- {
- display();
- }
- }
復制代碼
|