- #include "STC8H2K12U.h"
- #include <intrins.h>
- // 引脚定义
- sbit LCD_SDA = P3^4; // SPI数据
- sbit LCD_SCLK = P3^5; // SPI时钟
- sbit LCD_A0 = P3^2; // 0=命令,1=数据
- sbit LCD_RST = P3^3; // 复位
- sbit LCD_CS = P3^1; // 片选
- // 延时函数(微秒级,近似值)
- void Delay_us(unsigned int us) {
- while(us--) {
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- }
- }
- // 延时函数(毫秒级)
- void Delay_ms(unsigned int ms) {
- unsigned int i, j;
- for(i=0; i<ms; i++)
- for(j=0; j<1200; j++);
- }
- // 向LCD发送1字节数据(SPI模拟)
- void LCD_WriteByte(unsigned char dat) {
- unsigned char i;
- LCD_CS = 0; // 选中屏幕
- for(i=0; i<8; i++) {
- LCD_SCLK = 0; // 时钟拉低
- LCD_SDA = (dat & 0x80) ? 1 : 0; // 发送高位
- dat <<= 1; // 移位
- LCD_SCLK = 1; // 时钟拉高,锁存数据
- }
- LCD_CS = 1; // 取消片选
- }
- // 发送命令
- void LCD_WriteCmd(unsigned char cmd) {
- LCD_A0 = 0; // 命令模式
- LCD_WriteByte(cmd);
- }
- // 发送数据
- void LCD_WriteData(unsigned char dat) {
- LCD_A0 = 1; // 数据模式
- LCD_WriteByte(dat);
- }
- // 屏幕初始化
- void LCD_Init(void) {
- LCD_RST = 0; // 复位
- Delay_ms(10);
- LCD_RST = 1; // 释放复位
- Delay_ms(100);
-
- LCD_WriteCmd(0xAF); // 开显示
- LCD_WriteCmd(0xA0); // 列地址正序(根据屏幕调整)
- LCD_WriteCmd(0xC0); // 行地址正序(根据屏幕调整)
- LCD_WriteCmd(0xA6); // 正常显示(0xA7反显)
- LCD_WriteCmd(0x15); // 设置列地址范围
- LCD_WriteData(0x00); // 起始列
- LCD_WriteData(0x7F); // 结束列(128列)
- LCD_WriteCmd(0x75); // 设置行地址范围
- LCD_WriteData(0x00); // 起始行
- LCD_WriteData(0x3F); // 结束行(64行)
- LCD_WriteCmd(0x01); // 清屏
- Delay_ms(10);
- }
- // 设置显示位置(x:0-127列,y:0-63行)
- void LCD_SetPos(unsigned char x, unsigned char y) {
- LCD_WriteCmd(0x15); // 设置列地址
- LCD_WriteData(x); // 起始列=x
- LCD_WriteData(0x7F); // 结束列固定为127
- LCD_WriteCmd(0x75); // 设置行地址
- LCD_WriteData(y); // 起始行=y
- LCD_WriteData(0x3F); // 结束行固定为63
- }
- // 清屏(填充0)
- void LCD_Clear(void) {
- unsigned int i, j;
- LCD_SetPos(0, 0);
- for(i=0; i<64; i++) { // 64行
- for(j=0; j<128; j++) { // 128列
- LCD_WriteData(0x00);
- }
- }
- }
- // 显示一个ASCII字符(8x16点阵,x:0-15列块,y:0-3行块)
- // 需提前定义字库(示例仅包含部分字符)
- unsigned char code ASCII_8x16[][16] = {
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 空格
- {0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00}, // '0' (0x30)
- // 更多字符需自行添加,可通过字模软件生成
- };
- void LCD_DispChar(unsigned char x, unsigned char y, unsigned char ch) {
- unsigned char i;
- ch -= 0x20; // 偏移量(空格为0x20)
- // 上8行
- LCD_SetPos(x*8, y*16);
- for(i=0; i<8; i++) {
- LCD_WriteData(ASCII_8x16[ch][i]);
- }
- // 下8行
- LCD_SetPos(x*8, y*16 + 8);
- for(i=8; i<16; i++) {
- LCD_WriteData(ASCII_8x16[ch][i]);
- }
- }
- // 显示字符串
- void LCD_DispString(unsigned char x, unsigned char y, unsigned char *str) {
- while(*str) {
- LCD_DispChar(x++, y, *str++);
- if(x >= 16) { // 128列 / 8列每字符 = 16个字符
- x = 0;
- y++;
- if(y >= 4) y = 0; // 64行 / 16行每字符 = 4行
- }
- }
- }
- void main(void) {
- LCD_Init(); // 初始化屏幕
- LCD_Clear(); // 清屏
-
- // 显示示例
- LCD_DispString(0, 0, "Mini12864 Test");
- LCD_DispString(0, 1, "STC8H Driver");
- LCD_DispChar(0, 3, 'A'); // 显示单个字符
-
- while(1);
- }
复制代码 |