|
實驗成功能夠顯示字符,程序源碼如下
單片機源程序如下:
- #include <stm32f10x.h>
- #include "stm_systick.h"
- #include "hem12864.h"
- #include "stm_gpio_init.h"
- #include "FONT.H"
- //#define HEM12864_RS PDout(10)
- //#define HEM12864_RST PDout(9)
- //#define HEM12864_CS PDout(8)
- //u8 charA[] ={0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00};/*"B",0*/
- //u8 chartemp[] = {0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00};/*"?",0*/
- void hem12864_gpio_init(void)
- {
- RCC->APB2ENR |= 1 << 5;//開GPIOD時鐘
- GPIOD->CRH &= 0xFFFF0000;
- GPIOD->CRH |= 0x00002222;//GPIOD0~11推挽輸出
- GPIOD->ODR |= 0x7 << 8;
- GPIOD->ODR &= 0 << 11;
- RCC->APB2ENR |= 1 << 3;//開GPIOB時鐘
- GPIOB->CRH &= 0x0F0FFFFF;
- GPIOB->CRH |= 0x20200000;//PB13/PB15推挽輸出
- GPIOB->ODR |= 1 << 13;//PB13上拉
- GPIOB->ODR |= 1 << 15;//PB15上拉
- }
- /*
- void HEM12864_SPI_Init(void)
- {
- RCC->APB2ENR |= 1 << 3;//開GPIOB時鐘
- RCC->APB1ENR |= 1 << 14;//開SPI2時鐘
- GPIOB->CRH &= 0x0F0FFFFF;
- GPIOB->CRH |= 0xB0B00000;//PB13/PB15復(fù)用
- GPIOB->ODR |= 1 << 13;//PB13上拉
- GPIOB->ODR |= 1 << 15;//PB15上拉
- SPI2->CR1 |= 0 << 10;//全雙工模式
- SPI2->CR1 |= 1 << 9;//軟件NSS管理
- SPI2->CR1 |= 1 << 8;
- SPI2->CR1 |= 1 << 2;//SPI主機
- SPI2->CR1 |= 0 << 11;//8Bit數(shù)據(jù)格式
- SPI2->CR1 |= 1 << 1;//空閑模式下SCK為1 CPOL=1
- SPI2->CR1 |= 1 << 0 ;//數(shù)據(jù)采樣從第二個時鐘邊沿開始,CPHA=1
- //對SPI2屬于APB1的外設(shè),時鐘頻率最大為36M。
- SPI2->CR1 |= 4 << 3; //FSCK = Fpclk1/32
- SPI2->CR1 |= 0 << 7;//MSB first
- SPI2->CR1 |= 1 << 6;//SPI設(shè)備使能
-
- }
-
- u8 SPI2_ReadWriteByte(u8 TxData)
- {
- u16 retry=0;
- while((SPI2->SR&1<<1)==0) //等待發(fā)送區(qū)空
- {
- retry++;
- if(retry>=0XFFFE)return 0; //超時退出
- }
- SPI2->DR=TxData; //發(fā)送一個Byte
- retry=0;
-
- }
- */
- /*
- void HEM12864_Init(void)
- {
- HEM12864_RST = 0;
- Delay_us(40000);
- HEM12864_RST = 1;
- HEM12864_CS = 0;
- HEM12864_RS = 0;
- SPI2_ReadWriteByte(0x30);
- Delay_us(120);
- SPI2_ReadWriteByte(0X30);
- Delay_us(40);
- SPI2_ReadWriteByte(0X0F);
- Delay_us(120);
- SPI2_ReadWriteByte(0X01);
- Delay_us(10000);
- SPI2_ReadWriteByte(0X06);
-
- }
- */
- //=========================LCD??????======================
- #define LCDA0 PDout(10)
- #define LCDRS PDout(9)
- #define HEM12864_CS PDout(8)
- #define LCDSK PBout(13)
- #define LCDSI PBout(15)
- /*
- sbit LCDA0=P2^5; //????
- sbit LCDSK=P2^6; //????
- sbit LCDSI=P2^7; //????
- sbit LCDRS=P2^4; //????
- */
- //=========================????=============================
- void LCDInit(); //?????
- void LCDWritecom(char com); //??????,????/????(0??,1??)
- void LCDShiftWrite(char dat); //???????
- void LCDSetXY(char x, char y); //??????
- //void LCDcls(char); //????,????????value
- //***************************????*******************************
- /*
- extern unsigned char code hzcode[][128]; //
- extern unsigned char code gbcode[][32]; //
- extern unsigned char code asc816code[][16]; //
- extern unsigned char code asc1832code[][64]; //
- extern unsigned char code arrow[]; //
- */
- void lcd12864_display_on(void) //顯示開
- {
- LCDWritecom(0xaf);
- }
- void lcd12864_display_off(void)//顯示關(guān)
- {
- LCDWritecom(0xae);
- }
- void lcd12864_display_normal(void) //正常顯示
- {
- LCDWritecom(0xa6);
- }
- void lcd12864_display_reverse(void) //反白顯示
- {
- LCDWritecom(0xa7);
- }
- void lcd12864_display_all_point_off(void) //全屏正常顯示
- {
- LCDWritecom(0xa4);
- }
- void lcd12864_display_all_point_on(void) //全屏點亮
- {
- LCDWritecom(0xa5);
- }
- void lcd12864_rst(void)
- {
- LCDRS=0; //LCD 復(fù)位有效(L)
- Delay_us(1000); // 延時1ms , Datasheet 要求至少大于1us
- LCDRS = 1; //LCD 復(fù)位無效(H)
- Delay_us(1000); //硬件復(fù)位
- LCDWritecom(0xe2); //寄存器復(fù)位
- Delay_us(1000);
- }
- //========================?????????=================================
- void LCDInit()
- {
- HEM12864_CS = 0;
- LCDRS=0; //LCD 復(fù)位有效(L)
- Delay_us(1000); // 延時1ms , Datasheet 要求至少大于1us
- LCDRS = 1; //LCD 復(fù)位無效(H)
- Delay_us(1000); //硬件復(fù)位
- LCDWritecom(0xe2); //寄存器復(fù)位
- Delay_us(1000);
- // 電源管理初始
- lcd12864_display_on(); //0xaf顯示器開,0xae顯示器關(guān)
- LCDWritecom(0x2f); ///0x2f升壓電路,電壓管理電路,
- //電壓跟隨電路均開(0x28-0x2f為設(shè)置上電控制模式)
- LCDWritecom(0x25); //0x20-0x27為V5電壓內(nèi)部電阻調(diào)整設(shè)置
- LCDWritecom(0x81); //電量設(shè)置模式
- LCDWritecom(0x0f); //0x01-0x3f電量寄存器設(shè)置模式
-
- // 根據(jù)屏的方向初始化安裝方向(復(fù)位后默認下面配置)
- LCDWritecom(0xa0); //0xa0為Segment正向,0xa1 為Segment反向
- //(0xa0-0xa1為ADC方向選擇)
- LCDWritecom(0xc8); //0xc0正向掃描,0xc8反射掃描
- // 顯示管理初始(復(fù)位后默認下面配置)
- lcd12864_display_normal(); //0xa6正向顯示,0xa7反向顯示
- lcd12864_display_all_point_off(); //0xa4正常顯示,0xa5全屏點亮
- // 指示器設(shè)置
- LCDWritecom(0xac); //
- LCDWritecom(0x00); //
- //背壓比設(shè)置
- LCDWritecom(0xf8); //
- LCDWritecom(0x00); //
- // LCDcls(0); //????????,????0
-
- }
- //========================?????(???????)=============================
- void LCDWritecom(char com)
- {
- // LCDCS = 0; //CS=0.?:??????CS,???????.
-
-
- LCDA0 = 0; //A0=0,????
- LCDShiftWrite(com);
- }
- void LCDWritedata(char data)
- {
- LCDA0 = 1; //A0=1,????
- LCDShiftWrite(data);
-
- // LCDCS = 1; //CS=1.?:??????CS,???????.
- }
- //===========================??(??)??????================================
- void LCDShiftWrite(char dat)
- {
- unsigned char i; //??????
- unsigned char Series,Temp; //??????
-
- LCDSK = 0; //SCL=0
- Series = dat;
- for(i=0; i<8; i++)
- {
- LCDSK = 0; //SCL=0
- Temp=Series & 0x80; //???7?
- if(Temp) //??Temp=1,??SI=1.??Temp+0,??SI=0
- {
- LCDSI = 1; //SI=1
- }
- else
- {
- LCDSI = 0; //SI=0
- }
- LCDSK = 1; //SCL=1????
- Series = Series << 1; //??1?
-
- }
- }
- void LCD12864_Pos(u8 x,u8 y)
- {
- u8 pos;
- if (x==1) {x=0x80;}
- else if (x==2) {x=0x90;}
- else if (x==3) {x=0x88;}
- else if (x==4) {x=0x98;}
- else x=0x80;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
ST7567.zip
(3.6 KB, 下載次數(shù): 4)
2021-4-23 10:45 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|