也不知發成功沒有 測試一下
單片機源程序如下:
- //SMG12864C標準圖形點陣型液晶顯示模塊的演示程序[C51編程語言][MCS51模擬口線接口方式]
- //應用產品: SMG12864C SMG12864BV SMG12864A SMG12864D3 標準圖形點陣型液晶顯示模塊
- // 本演示程序適用于SMG12864C液晶顯示模塊與MCS51系列單片機采用MCS51模擬口線的
- //硬件連線方式。
- // 本演示程序包括KS0108B兼容芯片的MCS51模擬口線接口子程序集,KS0108B兼容芯片的12864
- //液晶顯示模塊的基本子程序,12864系列繪圖子程序集,12864系列圖形子程序集,12864系列
- //精簡中英文字庫子程序集,以及SMG12864C系列標準圖形點陣型液晶顯示的演示子程序.
- // 本演示的內容為,在128列X64行的點陣液晶顯示屏上清屏,圖片演示,英文字符串演示,
- //中文字符串演示,反白顯示字符串,繪制矩形,寫點,繪制直線,全屏顯示.
- //-------------------------------------------------------------------------------
- //創建日期: 2020.5.18
- //軟件環境: VW For Windows
- //硬件環境: STC MCU,MCS-51系列 MCU,etc.
- //工程師 :YF
- //-------------------------------------------------------------------------------
- //#include <stc15.h>
- #include <reg51.h>
- #include <intrins.h>
- signed char second=0,minute=0,hour=12,count=0; //從中午開始計時就改hour
- unsigned int day=53;
- void num2str(unsigned int dd);
- void time0_init();
- //以下為演示程序的函數定義
- void exsample(void); //演示程序
- void exdelay(void); //演示延時子程序
- void putchar(unsigned int c); //定位寫字符子程序
- void putcharD(unsigned int d); //定位寫大字符子程序
- void putstr(unsigned char code *s); //顯示字符串子程序,字符碼為0時退出
- void putstrD(unsigned char code *t); //顯示大字符串子程序,字符碼為0時退出
- unsigned char code *getchinesecodepos(unsigned int ac);
- unsigned char code *getChn_Codepos(unsigned int ad); //中文大字符
- unsigned char code *getenglishcodepos(unsigned char ac);
- unsigned char code *getEng_Codepos(unsigned char ad); //英文大字符
- void putimage(unsigned char code *s); //顯示圖形子程序
- void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
- //顯示指定大小的圖形子程序
- // void point(bit b);
- // void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
- // void lineto(unsigned char x1,unsigned char y1,bit b);//繪制(XPOS,YPOS)-(X1,Y1)的直線
- // void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
- void lcdfill(unsigned char d); //整屏顯示d代表的字節數據子程序
- void lcdpos(void); //設置坐標點(XPOS,YPOS)內部RAM地址的子程序
- void lcdreset(void); //液晶顯示控制器初始化子程序
- void setlcdvoltage(unsigned char vol); //LCD電壓設置
- void lcdwd(unsigned char d); //送圖形數據子程序
-
- void lcdwc(unsigned char c); //送指令子程序
- void lcdwaitidle(void); //忙檢測子程序
- void lcdwd1(unsigned char d); //送圖形數據子程序
-
- void lcdwc1(unsigned char c); //送指令子程序
- void lcdwaitidle1(void); //忙檢測子程序
- void lcdwd2(unsigned char d); //送圖形數據子程序
-
- void lcdwc2(unsigned char c); //送指令子程序
- void lcdwaitidle2(void); //忙檢測子程序
- //-------------------------------------------------------------------------------
- //SMG12864C產品引腳說明及演示連線
- //PIN1: VSS [電源地]
- //PIN2: VDD [電源正極]
- //PIN3: Vo [LCD偏壓輸入]
- //PIN4: RS [數據/命令選擇端 1:數據 0:命令]
- //PIN5: RW [讀寫信號選擇端 1:讀操作 0:寫操作]
- //PIN6: E [使能信號輸入 高有效]
- //PIN7: DB0 [Data I/O]
- //PIN8: DB1 [Data I/O]
- //PIN9: DB2 [Data I/O]
- //PIN10:DB3 [Data I/O]
- //PIN11:DB4 [Data I/O]
- //PIN12:DB5 [Data I/O]
- //PIN13:DB6 [Data I/O]
- //PIN14:DB7 [Data I/O]
- //PIN15:CS1 [片選1信號輸入 高有效]
- //PIN16:CS2 [片選2信號輸入 高有效]
- //PIN17:RST [復位信號輸入(H:正常工作,L:復位)]
- //PIN18:VEE [LCD驅動負壓輸出(-10V)]
- //PIN19:EL-E [EL 使能端(低電平有效)]
- //PIN20:NC [空腳]
- //注:8031的晶振頻率為12MHz.
- //請參見http://download.sunman.cn/lcm/product/1/SMG12864C.pdf
- /************* 本地變量聲明 **************/
- void Send_595(unsigned char dat);
- void Send_byte_over(unsigned char sda);
- sfr AUXR = 0x8E; //0000,0000 輔助寄存器
- sfr P4 = 0xe8;
- sbit P46 = P4^6;
- sbit P45 = P4^5; //ISP下載需勾選"ALE腳用作P4.5口"
- sbit P44 = P4^4;
- sbit P43 = P4^3;
- sbit P42 = P4^2;
- sbit P41 = P4^1;
- sbit P40 = P4^0;
- sfr P5 = 0xC8;
- //-------------------------------------------------------------------------------
- //以下為產品接口引腳在演示程序中的預定義
- //用戶在編寫應用程序時,需按自己的實際硬件連線來重新定義
- sbit RS = P3^5; // RS對應單片機引腳
- sbit RW = P3^4; // RW對應單片機引腳
- sbit EN = P3^3; // E對應單片機引腳
- sbit CS1 = P3^2; // CS1對應單片機引腳
- sbit CS2 = P3^1; // CS2對應單片機引腳
- sbit RST = P5^5;
- sbit P_HC595_SRCLK = P1^0; //pin 11 SRCLK Shift data clock
- sbit P_HC595_RCLK = P3^7; //pin 12 RCLk store (latch) clock
- sbit P_HC595_SER = P3^6; //pin 14 SER data input
- //-------------------------------------------------------------------------------
- //以下XPOS,YPOS變量用于指示當前操作點的位置的預定義
- //用戶在編寫應用程序時,需按自己的實際軟件程序需要來重新定義
- unsigned char XPOS; //列方向LCD點陣位置指針
- unsigned char YPOS; //行方向LCD點陣位置指針
- bit CharImageReverse; //字符及圖形的反顯控制,0(正常顯示),1(反顯)
- #define XDOTS 128 //圖形空間X方向大小
- #define YDOTS 64 //圖形空間X方向大小
- //-------------------------------------------------------------------------------
- //以下為精簡版中英文字庫
- //實際使用時請包含由Sunman精簡版中英文字符庫代碼生成器.exe自動生成的charlib.c文
- //文件來替換該部分
- #define ENGLISHCHARNUMBER 1 //精簡版英文字符庫中的英文字符的個數
- #define CHINESECHARNUMBER 5 //精簡版中文字符庫中的中文字符的個數
- #define ENGLISHCHARSIZE 8 //英文字符X方向顯示點的個數
- #define CHINESECHARSIZE 16 //中文字符X方向及中英文字符Y方向顯示點的個數
- #define ENGLISHCHARDOTSIZE 16 //單個英文字符點陣的字節數
- #define CHINESECHARDOTSIZE 32 //單個中文字符點陣的字節數
- unsigned int code EnglishCode[]={
- 0x20 //字符001:[ ]
- };
- unsigned int code ChineseCode[]={
- 0xbbb9, //字符001:[還]
- 0xbee0, //字符002:[距]
- 0xbfbc, //字符003:[考]
- 0xd3d0, //字符004:[有]
- 0xd6d0 //字符005:[中]
- };
- unsigned char code EnglishCharDot[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符001:[ ]
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- unsigned char code ChineseCharDot[]={
- 0x40,0x00,0x40,0x40,0x42,0x20,0xcc,0x1f, //字符001:[還]
- 0x00,0x20,0x00,0x42,0x02,0x41,0x82,0x40,
- 0x42,0x40,0xf2,0x5f,0x0e,0x40,0x42,0x40,
- 0x82,0x40,0x02,0x43,0x00,0x40,0x00,0x00,
- 0x00,0x20,0x3e,0x3f,0x22,0x20,0xe2,0x1f, //字符002:[距]
- 0x22,0x11,0x3e,0x11,0x00,0x00,0xfe,0x7f,
- 0x22,0x44,0x22,0x44,0x22,0x44,0x22,0x44,
- 0x22,0x44,0xe2,0x47,0x02,0x40,0x00,0x00,
- 0x20,0x10,0x20,0x08,0x24,0x04,0x24,0x02, //字符003:[考]
- 0x24,0x01,0x24,0x0d,0xbf,0x0b,0x64,0x09,
- 0x24,0x49,0x34,0x89,0x28,0x49,0x24,0x39,
- 0x22,0x01,0x20,0x00,0x20,0x00,0x00,0x00,
- 0x04,0x04,0x04,0x02,0x04,0x01,0x84,0x00, //字符004:[有]
- 0xe4,0xff,0x3c,0x09,0x27,0x09,0x24,0x09,
- 0x24,0x09,0x24,0x49,0x24,0x89,0xe4,0x7f,
- 0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0xf0,0x0f,0x10,0x04, //字符005:[中]
- 0x10,0x04,0x10,0x04,0x10,0x04,0xff,0xff,
- 0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,
- 0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00
- };
- //本文件由Sunman精簡版中英文字符庫代碼生成器.exe自動生成
- //字節方向:[垂直] 字位順序:[從低到高]
- //中文字體:[華文新魏] 英文字體:[華文新魏] 字體大小:[32]
- //下面是大字體的數字和漢字天;楷體不完整;
- #define ENG_NUMBER 10 //精簡版英文字符庫中的英文字符的個數
- #define CHN_NUMBER 1 //精簡版中文字符庫中的中文字符的個數
- #define ENG_SIZE 16 //英文字符X方向顯示點的個數
- #define CHN_SIZE 32 //中文字符X方向及中英文字符Y方向顯示點的個數
- #define ENG_DOTSIZE 64 //單個英文字符點陣的字節數
- #define CHN_DOTSIZE 128 //單個中文字符點陣的字節數
- unsigned int code Eng_Code[]={
- 0x30, //字符001:[0]
- 0x31, //字符002:[1]
- 0x32, //字符003:[2]
- 0x33, //字符004:[3]
- 0x34, //字符005:[4]
- 0x35, //字符006:[5]
- 0x36, //字符007:[6]
- 0x37, //字符008:[7]
- 0x38, //字符009:[8]
- 0x39 //字符010:[9]
- };
- unsigned int code Chn_Code[]={
- 0xccec //字符001:[天]
- };
- unsigned char code Eng_Dot[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符001:[0]
- 0x00,0xfe,0x07,0x00,0x80,0x03,0x1c,0x00,
- 0x40,0x00,0x60,0x00,0x20,0x00,0xc0,0x00,
- 0x10,0x00,0x80,0x00,0x18,0x00,0x80,0x01,
- 0x18,0x00,0x80,0x01,0x18,0x00,0x80,0x01,
- 0x18,0x00,0x80,0x01,0x18,0x00,0x80,0x00,
- 0x30,0x00,0x40,0x00,0x60,0x00,0x20,0x00,
- 0xc0,0x01,0x1c,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符002:[1]
- 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,
- 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
- 0xf0,0xff,0xff,0x01,0x30,0x00,0x80,0x01,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符003:[2]
- 0x00,0x00,0xc0,0x01,0x60,0x00,0xe0,0x01,
- 0x30,0x00,0xb0,0x01,0x38,0x00,0x98,0x01,
- 0x18,0x00,0x98,0x01,0x18,0x00,0x8c,0x01,
- 0x18,0x00,0x86,0x01,0x18,0x00,0x83,0x01,
- 0x38,0x80,0x81,0x01,0x30,0xc0,0x80,0x01,
- 0x60,0x70,0x80,0x01,0xc0,0x1f,0x80,0x01,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符004:[3]
- 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,
- 0x30,0x00,0x80,0x01,0x38,0x60,0x80,0x01,
- 0x18,0x60,0x80,0x01,0x18,0x60,0x80,0x01,
- 0x18,0x70,0x80,0x01,0x18,0x50,0xc0,0x01,
- 0x38,0xd0,0xc0,0x00,0x30,0x88,0x60,0x00,
- 0xe0,0x87,0x73,0x00,0x80,0x03,0x1f,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符005:[4]
- 0x00,0x00,0x07,0x00,0x00,0xc0,0x06,0x00,
- 0x00,0x60,0x06,0x00,0x00,0x10,0x06,0x00,
- 0x00,0x08,0x06,0x00,0x00,0x06,0x06,0x00,
- 0x00,0x03,0x06,0x00,0x80,0x01,0x06,0x00,
- 0xc0,0x00,0x06,0x00,0xe0,0x00,0xc6,0x01,
- 0xf0,0xff,0xff,0x01,0x00,0x00,0x06,0x00,
- 0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符006:[5]
- 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,
- 0x00,0x10,0xc0,0x01,0x80,0x1f,0xc0,0x01,
- 0x38,0x18,0x80,0x01,0x18,0x18,0x80,0x01,
- 0x18,0x18,0xc0,0x01,0x18,0x18,0xc0,0x00,
- 0x18,0x18,0xc0,0x00,0x18,0x18,0x60,0x00,
- 0x18,0x30,0x60,0x00,0x18,0x70,0x38,0x00,
- 0x18,0xc0,0x0f,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符007:[6]
- 0x00,0xc0,0x0f,0x00,0x00,0xf8,0x3f,0x00,
- 0x00,0x46,0x40,0x00,0x80,0x41,0xc0,0x00,
- 0xc0,0x20,0x80,0x01,0x60,0x20,0x80,0x01,
- 0x20,0x30,0x80,0x01,0x30,0x30,0x80,0x01,
- 0x10,0x30,0x80,0x01,0x18,0x30,0x80,0x00,
- 0x10,0x60,0xc0,0x00,0x00,0xe0,0x60,0x00,
- 0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符008:[7]
- 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
- 0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,
- 0x30,0x00,0xf0,0x01,0x30,0x00,0x7c,0x00,
- 0x30,0x00,0x0f,0x00,0x30,0xc0,0x01,0x00,
- 0x30,0x60,0x00,0x00,0x30,0x18,0x00,0x00,
- 0x30,0x06,0x00,0x00,0xb0,0x03,0x00,0x00,
- 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符009:[8]
- 0x00,0x00,0x00,0x00,0xc0,0x07,0x3f,0x00,
- 0x60,0x8c,0xe1,0x00,0x30,0x90,0xc0,0x00,
- 0x10,0x70,0x80,0x01,0x18,0x60,0x80,0x01,
- 0x18,0x60,0x80,0x01,0x18,0x60,0x80,0x01,
- 0x18,0x60,0x80,0x01,0x18,0xd0,0x80,0x00,
- 0x30,0xd8,0xc0,0x00,0x60,0x8c,0x61,0x00,
- 0xc0,0x03,0x1f,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符010:[9]
- 0x00,0x0f,0x00,0x00,0xc0,0x39,0x00,0x00,
- 0x20,0x60,0x00,0x00,0x30,0x40,0x80,0x01,
- 0x10,0xc0,0x80,0x01,0x18,0xc0,0x80,0x00,
- 0x18,0xc0,0xc0,0x00,0x18,0xc0,0x40,0x00,
- 0x18,0x40,0x20,0x00,0x10,0x40,0x38,0x00,
- 0x30,0x20,0x0c,0x00,0x60,0xb0,0x07,0x00,
- 0x80,0xff,0x01,0x00,0x00,0x00,0x00,0x00
- };
- unsigned char code Chn_Dot[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //字符001:[天]
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
- 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,
- 0x00,0x00,0xc0,0x00,0x00,0xc0,0x40,0x00,
- 0x00,0x40,0x20,0x00,0x80,0x61,0x10,0x00,
- 0x80,0x63,0x08,0x00,0x80,0x63,0x03,0x00,
- 0x80,0xfb,0x03,0x00,0xc0,0x33,0x03,0x00,
- 0xc0,0x31,0x02,0x00,0xc0,0x10,0x04,0x00,
- 0xe0,0x10,0x00,0x00,0x40,0x18,0x00,0x00,
- 0x00,0x18,0x30,0x00,0x00,0x10,0xe0,0x00,
- 0x00,0x00,0xe0,0x01,0x00,0x00,0xc0,0x01,
- 0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0x01,
- 0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,
- 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- /*------------------------------------------------
- uS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數,含有輸入參數 unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時100uS
- DelayUs2x(50);
- DelayUs2x(50);
- }
- }
- ////-------------------------------------------------------------------------------
- ////以下為圖片庫點陣代碼
- ////實際使用時請包含由SUNMAN圖形點陣代碼生成器.EXE自動生成的imagelib.c文件來替換
- void TM0_Isr() interrupt 1 using 1
- {
- count++;
- if(count==100)
- {
- count=0;
- second--;
- if(second<0)
- {
- second=59;
- minute--;
- if(minute<0)
- {
- minute=59;
- hour--;
- if(hour<0)
- {
- hour=24;
- day--;
- }
- if(day==0)
- {
- day=99;
- }
- }
-
- }
-
- }
-
- }
- void time0_init()
- {
- //AUXR |= 0x80; //定時器0為1T模式
- AUXR &= 0x7f; //定時器0為12T模式
- TMOD = 0x00;
- TL0 = (65536-9217)%256; //10ms
- TH0 = (65536-9217)/256;
- TR0 = 1; //啟動定時器
- ET0 = 1; //使能定時器中斷
- EA = 1;
- }
- void num2str(unsigned int dd) //將兩位數字拆分為10位和個位的數字,放入字符函數的數組地址中,分別用字符輸出函數顯示輸出
- { unsigned int a,b;
- a=dd/10%10; //兩位整數的10位
- b=dd%10; //兩位整數的個位
- //Eng_Code[]是英文大字符的名稱數組16進制編號,Eng_Dot[]是英文大字符的圖形點陣地址數組
- putcharD(a+0X30);
- //exdelay();
- putcharD(b+0X30);
- exdelay();
- }
- //-------------------------------------------------------------------------------
- void main(void)
- {
- P42 = 0;
- RST = 0;
- exdelay();
- RST = 1;
- time0_init();
- while(1)
- {
- lcdreset(); //初始化液晶顯示控制器
- exsample(); //演示程序
- }
- }
- void exsample(void) //演示程序
- {
- //0.演示前的準備,將LCD液晶顯示全部清空
- CharImageReverse=0; //反顯關閉
- lcdfill(0); //清屏
- //1.圖片測試: 在(8,16)位置顯示32點陣SUNMAN圖標
- // XPOS=8;
- // YPOS=8;
- // putimage(Img_sunman_32); //寫數據到當前LCDRAM地址中
- // exdelay(); //延時約600mS
- //3.字符串測試: 在(40,32)位置顯示"太陽人電子"字符串.
- XPOS=10;
- YPOS=0;
- putstr("距中考還有");
- // exdelay(); //延時約600mS
-
- //2.字符串測試: 在(26,32)位置顯示變化的數字day,在(58,32)位置顯示"天"字符串.
- XPOS=26;
- YPOS=32;
- num2str(day); //字符串變量一般都是數組,如何用指針變量定位碼表中的字符?
- XPOS=58;
- YPOS=32;
- putstrD("天");
- exdelay(); //延時約600mS
- exdelay();exdelay();
- //4.反顯測試: 在(40,32)位置反顯"太陽人電子"字符串.
- XPOS=26;
- YPOS=32;
- CharImageReverse=1;
- num2str(day);
- XPOS=58;
- YPOS=32;
- putstrD("天");
- CharImageReverse=0;
- exdelay(); //延時約600mS
- exdelay();
- }
- void exdelay(void) //演示延時子程序
- { unsigned char i,j,k; //延時約600mS
- for(i=0;i<60;i++)
- for(j=0;j<100;j++)
- for(k=0;k<200;k++);
- }
- //-------------------------------------------------------------------------------
- //以下putchar為字符對象的基本子程序,putstr為字符對象的擴充子程序,getchinesecodepos,
- //getenglishcodepos為字符對象的輔助子程序.
- //-------------------------------------------------------------------------------
- //子程序名稱:void putchar(unsigned int c).
- //功能:在(XPOS,YPOS)位置寫單個字符點陣,若c>128 表示為中文字符,否則為西文字符
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putchar(unsigned int c) //定位寫字符子程序
- { if(c>128)
- putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,getchinesecodepos(c));
- else
- putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,getenglishcodepos(c));
- }
- //-------------------------------------------------------------------------------
- void putcharD(unsigned int d) //定位寫大字符子程序
- { if(d>128)
- putsizeimage(CHN_SIZE,CHN_SIZE,getChn_Codepos(d));
- else
- putsizeimage(ENG_SIZE,CHN_SIZE,getEng_Codepos(d));
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void putstr(unsigned char code *s).
- //功能:寫字符串點陣,若*s=0 表示字符串結束.
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putstr(unsigned char code *s) //顯示字符串子程序,字符碼為0時退出
- { unsigned int c;
- while(1)
- { c=*s;
- s++;
- if(c==0) break;
- if(c<128)
- putchar(c);
- else
- { putchar(c*256+*s);
- s++;
- }
- }
- }
- //-------------------------------------------------------------------------------
- void putstrD(unsigned char code *t) //顯示大字符串子程序,字符碼為0時退出
- { unsigned int c;
- while(1)
- { c=*t;
- t++;
- if(c==0) break;
- if(c<128)
- putcharD(c);
- else
- { putcharD(c*256+*t);
- t++;
- }
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:unsigned char code *getchinesecodepos(unsigned char ac).
- //功能:根據當前中文字符碼查表后計算得到當前中文字符碼的字庫點陣位置.
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- unsigned char code *getchinesecodepos(unsigned int ac)
- { unsigned int min,max,mid,midc;
- min=0;
- max=CHINESECHARNUMBER-1;
- while(1)
- { if(max-min<2)
- { if(ChineseCode[min]==ac)
- mid=min;
- else if(ChineseCode[max]==ac)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=ChineseCode[mid];
- if(midc==ac)
- break;
- else if(midc>ac)
- max=mid-1;
- else
- min=mid+1;
- }
- return ChineseCharDot+mid*CHINESECHARDOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- unsigned char code *getChn_Codepos(unsigned int ad) //中文大字符
- { unsigned int min,max,mid,midc;
- min=0;
- max=CHN_NUMBER-1;
- while(1)
- { if(max-min<2)
- { if(Chn_Code[min]==ad)
- mid=min;
- else if(Chn_Code[max]==ad)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=Chn_Code[mid];
- if(midc==ad)
- break;
- else if(midc>ad)
- max=mid-1;
- else
- min=mid+1;
- }
- return Chn_Dot+mid*CHN_DOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:unsigned char code *getenglishcodepos(unsigned char ac).
- //功能:根據當前ASCII字符碼查表后計算得到當前ASCII字符碼的字庫點陣位置.
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- unsigned char code *getenglishcodepos(unsigned char ac)
- { unsigned char min,max,mid,midc;
- min=0;
- max=ENGLISHCHARNUMBER-1;
- while(1)
- { if(max-min<2)
- { if(EnglishCode[min]==ac)
- mid=min;
- else if(EnglishCode[max]==ac)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=EnglishCode[mid];
- if(midc==ac)
- break;
- else if(midc>ac)
- max=mid-1;
- else
- min=mid+1;
- }
- return EnglishCharDot+mid*ENGLISHCHARDOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- unsigned char code *getEng_Codepos(unsigned char ad) //英文大字符
- { unsigned char min,max,mid,midc;
- min=0;
- max=ENG_NUMBER-1;
- while(1)
- { if(max-min<2)
- { if(Eng_Code[min]==ad)
- mid=min;
- else if(Eng_Code[max]==ad)
- mid=max;
- else
- mid=0;
- break;
- }
- mid=(max+min)/2;
- midc=Eng_Code[mid];
- if(midc==ad)
- break;
- else if(midc>ad)
- max=mid-1;
- else
- min=mid+1;
- }
- return Eng_Dot+mid*ENG_DOTSIZE;
- }
- //-------------------------------------------------------------------------------
- //以下putsizeimage為圖形對象的基本子程序,putimage為圖形對象的擴充子程序
- //-------------------------------------------------------------------------------
- //子程序名稱:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
- // unsigned char code *s)
- //功能:在(XPOS,YPOS)位置繪制XSIZE列及YISZE行點陣的圖形*S.
- //修改日期:2009.8.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
- {
- unsigned char k,lx,ly,a1,a2,y,Lcd_Mask;
- k=YPOS&0x7;
- YSIZE+=k;
- y=YPOS;
- s--;
- for(lx=0;lx<XSIZE;lx++,XPOS++)
- { for(YPOS=y,ly=k;ly<YSIZE;)
- { unsigned char p;
- a1=*s;
- s++;
- a2=*s;
- if(CharImageReverse)
- { a1=~a1;
- a2=~a2;
- }
- for(p=0;p<k;p++)
- { a2>>=1;
- if((a1&0x1)==1)
- a2+=0x80;
- a1>>=1;
- }
- if((k==0) && (YSIZE<ly+8))
- { lcdpos();
- ly+=8;
- YPOS+=8;
- }
- else
- { lcdpos();
-
- lcdpos();
- ly+=8;
- YPOS+=8;
- Lcd_Mask=0xff;
- p=YSIZE&0x7;
- while(p>0)
- { Lcd_Mask>>=1;
- YPOS--;
- p--;
- }
- p=0xff;
- while(YSIZE<ly)
- { ly--;
- YPOS--;
- p<<=1;
- }
- Lcd_Mask&=p;
- a2&=Lcd_Mask;
- a2|=a1&(~Lcd_Mask);
- }
- lcdwd(a2);
- }
- if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
- }
- YPOS=y;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void putimage(unsigned char code *s).
- //功能:在(XPOS,YPOS)位置繪制XSIZE[*s]列及YISZE[*(s+1)]行點陣的圖形[*(s+2)].
- //修改日期:2009.8.18
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void putimage(unsigned char code *s) //顯示圖形子程序
- {
- unsigned char XSIZE,YSIZE;
- XSIZE=*s;
- s++;
- YSIZE=*s;
- s++;
- putsizeimage(XSIZE,YSIZE,s);
- }
- //-------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------
- //以下lcdfill,lcdpos,lcdreset為KS0108B型硬件接口的12864液晶顯示模塊的基本子程序
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdfill(unsigned char d).
- //功能:整屏顯示d表示的字節數據.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdfill(unsigned char d) //整屏顯示d代表的字節數據子程序
- {
- unsigned char j;
- for(YPOS=0;YPOS<64;YPOS+=8) //8頁
- { XPOS=0;
- lcdpos();
- for(j=0;j<64;j++) //64列
- lcdwd1(d); //送圖形數據
- XPOS=64;
- lcdpos();
- for(j=0;j<64;j++) //64列
- lcdwd2(d); //送圖形數據
- }
- XPOS=0;
- YPOS=0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdpos(void).
- //功能:設置坐標點(XPOS,YPOS)位置對應的內部RAM地址.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdpos(void) //設置坐標點(XPOS,YPOS)內部RAM地址的子程序
- { //unsigned char Column;
- if(XPOS<64)
- {
- lcdwc1(0xB8+((YPOS/8)&0x07)); //頁地址設置
- lcdwc1(0x40+XPOS); //列地址設置
- }
- else
- { lcdwc2(0xB8+((YPOS/8)&0x07)); //頁地址設置
- lcdwc2(0x40+(XPOS&0x3F)); //列地址設置
- }
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdreset(void)
- //功能:液晶顯示控制器初始化
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdreset(void) //液晶顯示控制器初始化子程序
- {
- lcdwc1(0xC0); //設置顯示初始行
- lcdwc2(0xC0); //設置顯示初始行
- lcdwc1(0x3F); //開顯示
- lcdwc2(0x3F); //開顯示
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdwd(unsigned char d).
- //功能:向液晶顯示控制器寫圖形數據.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwd(unsigned char d)
- {
- if(XPOS<64)
- lcdwd1(d);
- else
- lcdwd2(d);
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdwd1(unsigned char d).
- //功能:向液晶顯示控制器1寫圖形數據.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwd1(unsigned char d)
- {
- lcdwaitidle1();
- Send_byte_over(d);//通過74HC595 串行輸入數據,并行輸出到LCD的8位數據口
- RS = 1;
- RW =0;
- CS1 =1;
- CS2 =0;
- EN =1;
- _nop_();
- EN =0;
- CS1 =0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:void lcdwd2(unsigned char d).
- //功能:向液晶顯示控制器2寫圖形數據.
- //修改日期:2009.08.31
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwd2(unsigned char d)
- {
- lcdwaitidle2();
- Send_byte_over(d); //通過74HC595 串行輸入數據,并行輸出到LCD的8位數據口
- RS = 1;
- RW = 0;
- CS1 = 0;
- CS2 = 1;
- EN = 1;
- _nop_();
- EN = 0;
- CS2 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:lcdwc1(unsigned char c).
- //功能:向液晶顯示控制器1送指令.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwc1(unsigned char c) //向液晶顯示控制器1送指令
- {
- lcdwaitidle1();
- Send_byte_over(c);//通過74HC595 串行輸入數據,并行輸出到LCD的8位數據口
- RS = 0;
- RW = 0;
- CS1 = 1;
- CS2 = 0;
- EN = 1;
- _nop_();
- EN = 0;
- CS1 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:lcdwc2(unsigned char c).
- //功能:向液晶顯示控制器2送指令.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwc2(unsigned char c) //向液晶顯示控制器2送指令
- {
- lcdwaitidle2();
- Send_byte_over(c); //通過74HC595 串行輸入數據,并行輸出到LCD的8位數據口
- RS = 0;
- RW = 0;
- CS1 = 0;
- CS2 = 1;
- EN = 1;
- _nop_();
- EN = 0;
- CS2 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:voidlcdwaitidle1(void).
- //功能:忙檢測,在對液晶顯示控制器操作的每一條指令之前,需檢測液晶顯示器是否空閑.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwaitidle1(void) //控制器1忙檢測子程序
- {
- RS = 0;
- RW = 1;
- CS1 = 1;
- CS2 = 0;
- EN = 1;
- DelayMs(1);
- EN = 0;
- CS1 = 0;
- }
- //-------------------------------------------------------------------------------
- //子程序名稱:voidlcdwaitidle2(void).
- //功能:忙檢測,在對液晶顯示控制器操作的每一條指令之前,需檢測液晶顯示器是否空閑.
- //修改日期:2009.10.30
- //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
- //-------------------------------------------------------------------------------
- void lcdwaitidle2(void) //控制器2忙檢測子程序
- {
- RS = 0;
- RW = 1;
- CS1 = 0;
- CS2 = 1;
- EN = 1;
- DelayMs(1); //查忙由延時替代
- EN = 0;
- CS2 = 0;
- }
- /**********************************************/
- void Send_595(unsigned char dat) //發送一個字節
- {
- unsigned char i;
- for(i=0; i<8; i++)
- {
- if(dat & 0x80) P_HC595_SER = 1;
- else P_HC595_SER = 0;
- P_HC595_SRCLK = 1;
- P_HC595_SRCLK = 0;
- dat = dat << 1;
- }
- }
- void Send_byte_over(unsigned char sda)
- {
- Send_595(sda);
- P_HC595_RCLK = 1;
- P_HC595_RCLK = 0;
- }
復制代碼
|