现在我用c8051F020练习做一个液晶显示,不知道怎么显示不出来。在本站看过其他帖说是c8051F020速度太快,要加延时,现在延时也加了,还是不行,诸位大大帮个忙解决一下啊。谢谢。
下面是我参考别人的程序编写的源程序:
LCD128X64.H 文件内容
/*--------------------------------------------------------------*/
//File: LCD128X64.H
//Note: RT12864J-1液晶显示
//CS1(左)-CS2(右), 是高电平有效!!!
//该液晶是行扫描!!!
//每8位显示数据是低位在上, 高位在下
//测试硬件
//单片机: c8051F020
//模式:
//外部晶振: 24MHz
#define uchar unsigned char
#define uint unsigned int
/*--------------------------------------------------------------*/
//防止重复引用
#ifndef __LCD128X64_H__
#define __LCD128X64_H__
#include "c8051F020.h"
uint i,j;
/*--------------------------------------------------------------*/
//字库码的引索
/*
(0) !(1) "(2) #(3) $(4) %(5) &(6) '(7)
((8) )(9) *(10) +(11) ,(12) -(13) .(14) /(15)
0(16) 1(17) 2(18) 3(19) 4(20) 5(21) 6(22) 7(23)
8(24) 9(25) :(26) ;(27) <(28) =(29) >(30) ?(31)
@(32) A(33) B(34) C(35) D(36) E(37) F(38) G(39)
H(40) I(41) J(42) K(43) L(44) M(45) N(46) O(47)
P(48) Q(49) R(50) S(51) T(52) U(53) V(54) W(55)
X(56) Y(57) Z(58) [(59) \(60) ](61) ^(62) _(63)
`(64) a(65) b(66) c(67) d(68) e(69) f(70) g(71)
h(72) i(73) j(74) k(75) l(76) m(77) n(78) o(79)
p(80) q(81) r(82) s(83) t(84) u(85) v(86) w(87)
x(88) y(89) z(90) {(91) |(92) }(93) ~(94)
/*--------------------------------------------------------------*/
// 字体: BatangChe
//取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
//查表方法: 要显示的ASCII码-32就可以得到字库码的指针
unsigned char code Font_code[][16] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},// 0
{0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00},//!1
{0x00,0x00,0x0C,0x3C,0x00,0x0C,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//"2
{0x00,0x20,0xE0,0x3E,0x20,0xE0,0x3E,0x20,0x04,0x7C,0x07,0x04,0x7C,0x07,0x04,0x00},//#3
{0x00,0x30,0x48,0x84,0xFE,0x84,0x0C,0x10,0x00,0x08,0x30,0x20,0x7F,0x20,0x11,0x0E},//$4
{0x00,0x30,0x48,0x24,0x98,0x68,0x18,0x04,0x00,0x20,0x18,0x06,0x19,0x24,0x12,0x0C},//%5
{0x00,0x00,0xB8,0xC4,0x24,0x98,0x80,0x80,0x00,0x1E,0x21,0x20,0x23,0x1C,0x27,0x10},//&6
{0x00,0x00,0x00,0x0C,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//'7
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},//(8
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},//)9
{0x00,0x00,0x20,0x40,0xF0,0x40,0x20,0x00,0x00,0x00,0x02,0x01,0x07,0x01,0x02,0x00},//*10
{0x00,0x80,0x80,0x80,0xF8,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00},//+11
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x00,0x00,0x00},//,12
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//-13
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00},//.14
{0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x00,0x00,0x30,0x0C,0x03,0x00,0x00,0x00,0x00},///15
{0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F},//016
{0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},//117
{0x00,0x30,0x08,0x04,0x04,0x84,0x48,0x30,0x00,0x38,0x24,0x22,0x21,0x20,0x30,0x08},//218
{0x00,0x10,0x08,0x84,0x84,0x84,0x48,0x30,0x00,0x08,0x10,0x20,0x20,0x20,0x11,0x0E},//319
{0x00,0x00,0x00,0xC0,0x30,0x08,0xFC,0x00,0x00,0x04,0x07,0x04,0x04,0x24,0x3F,0x24},//420
{0x00,0xFC,0x84,0x44,0x44,0x44,0x84,0x00,0x00,0x19,0x20,0x20,0x20,0x20,0x10,0x0F},//521
{0x00,0xF0,0x88,0x44,0x44,0x44,0x84,0x18,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F},//622
{0x00,0x10,0x0C,0x04,0x04,0x84,0x64,0x1C,0x00,0x00,0x00,0x00,0x3C,0x03,0x00,0x00},//723
{0x00,0x30,0x48,0x84,0x84,0x84,0x48,0x30,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x0E},//824
{0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00,0x08,0x11,0x22,0x22,0x22,0x11,0x0F},//925
{0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00},//:26
{0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x18,0x00,0x00,0x00},//;27
{0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x00,0x00,0x01,0x01,0x02,0x02,0x04,0x04},//<28
{0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02},//=29
{0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00,0x04,0x04,0x02,0x02,0x01,0x01,0x00},//>30
{0x00,0x18,0x04,0x02,0x02,0x82,0x44,0x38,0x00,0x00,0x00,0x00,0x37,0x00,0x00,0x00},//?31
{0x00,0xF0,0x08,0xC4,0x24,0xE4,0x08,0xF0,0x00,0x1F,0x20,0x47,0x48,0x47,0x48,0x2F},//@32
{0x00,0x00,0x00,0xE0,0x1C,0xE0,0x00,0x00,0x00,0x20,0x3F,0x24,0x04,0x24,0x3F,0x20},//A33
{0x00,0x04,0xFC,0x84,0x84,0x84,0x84,0x78,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x1F},//B34
{0x00,0xF0,0x08,0x04,0x04,0x04,0x0C,0x10,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0C},//C35
{0x00,0x04,0xFC,0x04,0x04,0x04,0x08,0xF0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F},//D36
{0x00,0x04,0xFC,0x84,0x84,0x84,0xCC,0x10,0x00,0x20,0x3F,0x20,0x20,0x20,0x31,0x08},//E37
{0x00,0x04,0xFC,0x84,0x84,0x84,0xCC,0x10,0x00,0x20,0x3F,0x20,0x20,0x00,0x01,0x00},//F38
{0x00,0xF0,0x08,0x04,0x04,0x08,0x0C,0x10,0x00,0x0F,0x10,0x20,0x20,0x11,0x3F,0x01},//G39
{0x00,0x04,0xFC,0x84,0x80,0x84,0xFC,0x04,0x00,0x20,0x3F,0x20,0x00,0x20,0x3F,0x20},//H40
{0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},//I41
{0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x18,0x20,0x20,0x20,0x1F,0x00,0x00},//J42
{0x00,0x04,0xFC,0x84,0x40,0x34,0x0C,0x04,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20},//K43
{0x00,0x04,0xFC,0x04,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x30,0x08},//L44
{0x00,0x04,0xFC,0x70,0x80,0x70,0xFC,0x04,0x00,0x20,0x3F,0x20,0x03,0x20,0x3F,0x20},//M45
{0x00,0x04,0xFC,0x70,0x80,0x04,0xFC,0x04,0x00,0x20,0x3F,0x20,0x01,0x0E,0x3F,0x00},//N46
{0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F},//O47
{0x00,0x04,0xFC,0x04,0x04,0x04,0x88,0x70,0x00,0x20,0x3F,0x21,0x01,0x01,0x00,0x00},//P48
{0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00,0x0F,0x10,0x28,0x28,0x28,0x30,0x4F},//Q49
{0x00,0x04,0xFC,0x04,0x04,0x88,0x70,0x00,0x00,0x20,0x3F,0x21,0x01,0x02,0x3C,0x20},//R50
{0x00,0x30,0x48,0x84,0x84,0x04,0x0C,0x10,0x00,0x08,0x30,0x20,0x20,0x21,0x11,0x0E},//S51
{0x00,0x10,0x0C,0x04,0xFC,0x04,0x0C,0x10,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00},//T52
{0x00,0x04,0xFC,0x04,0x00,0x04,0xFC,0x04,0x00,0x00,0x1F,0x20,0x20,0x20,0x1F,0x00},//U53
{0x00,0x04,0x7C,0x84,0x00,0x84,0x7C,0x04,0x00,0x00,0x00,0x07,0x38,0x07,0x00,0x00},//V54
{0x00,0x04,0xFC,0x04,0xF0,0x04,0xFC,0x04,0x00,0x00,0x03,0x3C,0x03,0x3C,0x03,0x00},//W55
{0x00,0x04,0x1C,0x64,0x80,0x64,0x1C,0x04,0x00,0x20,0x38,0x26,0x01,0x26,0x38,0x20},//X56
{0x00,0x04,0x1C,0xE4,0x00,0xE4,0x1C,0x04,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00},//Y57
{0x00,0x10,0x0C,0x04,0x84,0x64,0x1C,0x04,0x00,0x38,0x24,0x23,0x20,0x20,0x30,0x08},//Z58
{0x00,0x00,0x00,0x00,0xFE,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x00},//[59
{0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x00},//\60
{0x00,0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x7F,0x00,0x00,0x00},//]61
{0x00,0x08,0x04,0x02,0x02,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//^62
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40},//_63
{0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//`64
{0x00,0x80,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x1C,0x22,0x22,0x22,0x12,0x3F,0x20},//a65
{0x00,0x04,0xFC,0x80,0x40,0x40,0x80,0x00,0x00,0x00,0x3F,0x10,0x20,0x20,0x10,0x0F},//b66
{0x00,0x00,0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x00},//c67
{0x00,0x00,0x80,0x40,0x40,0x84,0xFC,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x3F,0x20},//d68
{0x00,0x80,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},//e69
{0x00,0x40,0x40,0xF8,0x44,0x44,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},//f70
{0x00,0x00,0x80,0x40,0x40,0x40,0x80,0x40,0x00,0x34,0x4B,0x4A,0x4A,0x4A,0x49,0x30},//g71
{0x00,0x04,0xFC,0x80,0x40,0x40,0x80,0x00,0x00,0x20,0x3F,0x20,0x00,0x20,0x3F,0x20},//h72
{0x00,0x00,0x00,0x40,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00},//i73
{0x00,0x00,0x00,0x40,0xCC,0x00,0x00,0x00,0x00,0x20,0x40,0x40,0x3F,0x00,0x00,0x00},//j74
{0x00,0x04,0xFC,0x00,0x40,0xC0,0x40,0x00,0x00,0x20,0x3F,0x22,0x05,0x28,0x30,0x20},//k75
{0x00,0x00,0x00,0x04,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00},//l76
{0x80,0xC0,0x80,0x40,0x80,0x40,0x40,0x80,0x20,0x3F,0x20,0x00,0x3F,0x00,0x20,0x3F},//m77
{0x00,0x80,0xC0,0x80,0x40,0x40,0x80,0x00,0x00,0x20,0x3F,0x20,0x00,0x20,0x3F,0x20},//n78
{0x00,0x00,0x80,0x40,0x40,0x40,0x80,0x00,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F},//o79
{0x00,0x40,0xC0,0x80,0x40,0x40,0x80,0x00,0x00,0x40,0x7F,0x48,0x10,0x10,0x08,0x07},//p80
{0x00,0x00,0x80,0x40,0x40,0x80,0xC0,0x40,0x00,0x07,0x08,0x10,0x10,0x48,0x7F,0x40},//q81
{0x00,0x00,0x40,0xC0,0x80,0x40,0x40,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},//r82
{0x00,0x80,0x40,0x40,0x40,0xC0,0x00,0x00,0x00,0x09,0x32,0x22,0x24,0x24,0x19,0x00},//s83
{0x00,0x40,0x40,0xF8,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00},//t84
{0x00,0x40,0xC0,0x00,0x00,0x00,0x40,0xC0,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F},//u85
{0x00,0x40,0xC0,0x40,0x00,0x40,0xC0,0x40,0x00,0x00,0x01,0x0E,0x30,0x0E,0x01,0x00},//v86
{0x00,0x40,0xC0,0x40,0x00,0x40,0xC0,0x40,0x00,0x00,0x07,0x38,0x06,0x38,0x07,0x00},//w87
{0x00,0x40,0xC0,0x40,0x00,0x40,0xC0,0x40,0x00,0x20,0x30,0x29,0x06,0x29,0x30,0x20},//x88
{0x00,0x40,0xC0,0x40,0x00,0x40,0xC0,0x40,0x00,0x60,0x41,0x26,0x18,0x06,0x01,0x00},//y89
{0x00,0x00,0xC0,0x40,0x40,0x40,0xC0,0x40,0x00,0x31,0x28,0x24,0x22,0x21,0x30,0x08},//z90
{0x00,0x00,0x80,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x00},//{91
{0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00},//|92
{0x00,0x02,0x02,0x7C,0x80,0x80,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00},//}93
{0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00}};//~94
/*--------------------------------------------------------------*/
//指令宏定义
#define Display_On 0x3f //显示开指令
#define Display_Off 0x3e //显示关指令
#define Y_Col_Addr 0x40 //定位到第0列指令(列起始地址)(0-63)
#define X_Page_Addr 0xb8 //定位到第0页指令(页起始地址)(0-7)
#define Start_Line 0xc0 //定位从DDROM中的第0行开始往屏幕上显示
/*--------------------------------------------------------------*/
//数据接口定义
sbit RS = P3^0; //数据指令控制端 //高电平数据,低电平指令
sbit RW = P3^1; //读写控制端 //高电平写入,低电平读出
sbit E = P3^2; //使能端 //下降沿写入数据,高电平读出
sbit CS1 = P3^3; //左边屏幕使能 //高电平有效
sbit CS2 = P3^4; //右边屏幕使能 //高电平有效
sbit RST = P3^5; //LCD复位端 //低电平复位
#define Data_IO P4
/*--------------------------------------------------------------*/
//函数声明(私有)
/*--------------------------------------------------------------*/
//延时
void Delay(uint ms)
{
for(i=0;i<ms;i++)
for(j=0;j<120;j++);
}
/*--------------------------------------------------------------*/
//读出指令(状态)
uchar LCD_read_cmd(void)
{
uchar read_cmd;
Data_IO = 0xff; //输入
RW = 1; //读出
RS = 0; //指令
read_cmd = Data_IO;
E = 1;
Delay(100);
E = 0;
return (read_cmd);
}
/*--------------------------------------------------------------*/
//检查忙标志位
void LCD_check_busy(void)
{
uchar lcd_status;
do{
lcd_status = LCD_read_cmd();
}while(lcd_status & 0x80);
}
/*--------------------------------------------------------------*/
//写入指令
void LCD_write_cmd(uchar cmd)
{
LCD_check_busy();
RW = 0; //写入
RS = 0; //指令
Data_IO = cmd; //指令
E = 1;
Delay(100);
E = 0; //下降沿写入
}
/*--------------------------------------------------------------*/
//写入数据
void LCD_write_dat(uchar dat)
{
LCD_check_busy();
RW = 0; //写入
RS = 1; //数据
Data_IO = dat; //数据
E = 1;
Delay(100);
E = 0; //下降沿写入
}
/*--------------------------------------------------------------*/
//显示清屏
void LCD_clr_scr(uchar sel_dat)
{
uchar i, j;
if(sel_dat == 0)
{CS2 = 0;CS1 = 1;} //左屏
else if(sel_dat == 1)
{CS2 = 1;CS1 = 0;} //右屏
else if(sel_dat == 2)
{CS2 = 1;CS1 = 1;} //全屏
LCD_write_cmd(Y_Col_Addr);
LCD_write_cmd(X_Page_Addr);
for(j = 0; j < 8; j++)
{
LCD_write_cmd(X_Page_Addr + j);
for(i = 0; i < 64; i++) LCD_write_dat(0x00);
}
}
/*--------------------------------------------------------------*/
//液晶定位(8*8)
//液晶规划:
//x: 0 - 7 (行)
//y: 0 -15 (列)
void LCD_pos(uchar x, uchar y)
{
if(y < 8)
{CS2 = 0;CS1 = 1;} //左半屏
else
{y -= 8;CS2 = 1;CS1 = 0;} // //右半屏
LCD_write_cmd(X_Page_Addr + x); //页地址
LCD_write_cmd(Y_Col_Addr + (y * 8));//列地址
}
/*--------------------------------------------------------------*/
//液晶字符输出(8*16字体)
//x: 0 -3/7 (行)
//y: 0 -15 (列)
void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat)
{
unsigned char i, j;
for(j = 0; j < 2; j++)
{
LCD_pos((x * 2 + j), y);
for(i = 0; i < 8; i++) LCD_write_dat(Font_code[c_dat - 32][8 * j + i]);
}
}
/*--------------------------------------------------------------*/
//液晶字符串输出
//x: 0 - 3 (行)
//y: 0 -15 (列)
void LCD_prints(uchar x, uchar y, uchar *s_dat)
{
while(*s_dat) LCD_printc(x, y++, *s_dat++);
}
/*--------------------------------------------------------------*/
//显示Run模式
void Disp_Run()
{
LCD_prints(0, 0, "Run Modes:");
LCD_prints(1, 1, "Charge&AutoRun");
LCD_prints(2, 1, "Remote Control");
LCD_prints(3, 1, "Demo Auto-Run");
}
/*--------------------------------------------------------------*/
//初始化LCD128*64
//清除所有显示DDRAM, 清除画面内容, 所有地址指针回0
void LCD_init_12864(void)
{
RST = 0;
RST = 1; //硬件复位
LCD_clr_scr(ASCR); //清全屏
LCD_write_cmd(Display_Off); //关闭显示
LCD_write_cmd(X_Page_Addr); //起始页地址
LCD_write_cmd(Start_Line); //起始行
LCD_write_cmd(Y_Col_Addr); //起始列地址
LCD_write_cmd(Display_On); //开启显示
}
/*--------------------------------------------------------------*/
void SYSCLK_Init(void)
{
int n;
OSCXCN = 0x67; // EXTERNAL Oscillator Control Register
for (n = 0; n < 255; n++) ; // wait for osc to start
while ( (OSCXCN & 0x80) == 0 ); // wait for xtal to stabilize
OSCICN = 0x88; // Internal Oscillator Control Register
}
/*--------------------------------------------------------------*/
void PORT_Init(void)
{
XBR1=0x80;
P3MDOUT = 0xFF; // Output configuration for P3
P74OUT = 0x03; // Output configuration for P4-7
}
/*--------------------------------------------------------------*/
#endif
下面是主程序Menu.c:
#include "LCD128X64.H"
/*--------------------------------------------------------------*/
//主函数
void main(void)
{
WDTCN=0xDE;
WDTCN=0xAD; //关看门狗
SYSCLK_Init();
PORT_Init();
LCD_init_12864();
while(1)
{ Disp_Run();}
} |