搜索
bottom↓
回复: 13

c8051F020驱动LCD12864怎么无法显示啊?

[复制链接]

出0入0汤圆

发表于 2010-1-12 18:41:10 | 显示全部楼层 |阅读模式
现在我用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();}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

发表于 2010-1-12 22:43:08 | 显示全部楼层
单片机速度太快,液晶比较慢,重新调整时序,特别是判忙和写入数据的时候

出0入0汤圆

发表于 2010-1-12 23:06:10 | 显示全部楼层
把清屏放在init()的最后面!看看你init()的时间,8051f的速度快哦!

出0入0汤圆

发表于 2010-1-12 23:08:03 | 显示全部楼层
如果程序能运行但是画面完全无显示的话,建议调节一下控制液晶屏对比度的电位器试试……

出0入0汤圆

 楼主| 发表于 2010-1-13 20:10:12 | 显示全部楼层
回复【3楼】i387DX
-----------------------------------------------------------------------
终于找到问题所在了
是函数
void PORT_Init(void)
{
XBR1=0x80;
P3MDOUT = 0xFF; // Output configuration for P3
P74OUT = 0x03;  // Output configuration for P4-7
}
有问题。
将其改为
void PORT_Init(void)
{
   XBR2=0x40; //允许交叉开关
}
就行了。
但是加上延时导致运行的时候显示的字符晃动,好像是刷新太慢。
不过,如果把延时去掉,不显示。
前提是将判忙函数屏蔽,加上判忙函数不显示。
原来的对比度调节也有问题,调节了一下对比度。

总之,谢谢诸位啦

出0入0汤圆

 楼主| 发表于 2010-1-22 16:45:33 | 显示全部楼层
已经有10天没搞这个程序了,现在回来发现原来的问题还没解决。重新修改了一下程序,以实现最简单的显示功能,不尽如人意的问题是加判忙函数,LCD不显示,不加判忙函数,LCD正常显示。看起来好像是两个读函数(读指令和读数据)的问题,求解决方案
(附:引脚说明和读写时序图)

LCD引脚说明 (原文件名:LCD引脚说明.JPG)


LCD读写时序 (原文件名:LCD读写时序.JPG)
/*--------------------------------------------------------------*/
//Note: RT12864J-1液晶显示
//CS1(左)-CS2(右), 是高电平有效!!!
//该液晶是行扫描!!!
//每8位显示数据是低位在上, 高位在下
//测试硬件
//单片机:  c8051f020
//模式:   
//晶振:           24MHz
//#include<intrins.h>

#include "c8051F020.h"
#define uchar unsigned char
#define uint unsigned int
uint i,j;
/*--------------------------------------------------------------*/
//系统时钟
#define SYSCLK 24000000
/*--------------------------------------------------------------*/
//字库码的引索
/*
  (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)*/
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
//          字体:        LCD1602字体
//取码规则:        低位在前, 列行扫描, 阴码(1-亮, 0-灭)
//查表方法: 要显示的ASCII码-32就可以得到字库码的指针
unsigned char code Font_code[][5] = {
{0x00,0x00,0x00,0x00,0x00},// (0)
{0x00,0x00,0x4F,0x00,0x00},//!(1)
{0x00,0x07,0x00,0x07,0x00},//"(2)
{0x14,0x7F,0x14,0x7F,0x14},//#(3)
{0x24,0x2A,0x7F,0x2A,0x12},//$(4)
{0x23,0x13,0x08,0x64,0x62},//%(5)
{0x36,0x49,0x55,0x22,0x50},//&(6)
{0x00,0x05,0x03,0x00,0x00},//'(7)
{0x00,0x1C,0x22,0x41,0x00},//((8)
{0x00,0x41,0x22,0x1C,0x00},//)(9)
{0x14,0x08,0x3E,0x08,0x14},//*(10)
{0x08,0x08,0x3E,0x08,0x08},//+(11)
{0x00,0x50,0x30,0x00,0x00},//,(12)
{0x08,0x08,0x08,0x08,0x08},//-(13)
{0x00,0x60,0x60,0x00,0x00},//.(14)
{0x20,0x10,0x08,0x04,0x02},///(15)
{0x3E,0x51,0x49,0x45,0x3E},//0(16)
{0x00,0x42,0x7F,0x40,0x00},//1(17)
{0x42,0x61,0x51,0x49,0x46},//2(18)
{0x21,0x41,0x45,0x4B,0x31},//3(19)
{0x18,0x14,0x12,0x7F,0x10},//4(20)
{0x27,0x45,0x45,0x45,0x39},//5(21)
{0x3C,0x4A,0x49,0x49,0x30},//6(22)
{0x01,0x71,0x09,0x05,0x03},//7(23)
{0x36,0x49,0x49,0x49,0x36},//8(24)
{0x06,0x49,0x49,0x29,0x1E},//9(25)
{0x00,0x36,0x36,0x00,0x00},//:(26)
{0x00,0x56,0x36,0x00,0x00},//;(27)
{0x08,0x14,0x22,0x41,0x00},//<(28)
{0x14,0x14,0x14,0x14,0x14},//=(29)
{0x00,0x41,0x22,0x14,0x08},//>(30)
{0x02,0x01,0x51,0x09,0x06},//?(31)
{0x32,0x49,0x79,0x41,0x3E},//@(32)
{0x7E,0x11,0x11,0x11,0x7E},//A(33)
{0x7F,0x49,0x49,0x49,0x3E},//B(34)
{0x3E,0x41,0x41,0x41,0x22},//C(35)
{0x7F,0x41,0x41,0x22,0x1C},//D(36)
{0x7F,0x49,0x49,0x49,0x41},//E(37)
{0x7F,0x09,0x09,0x09,0x01},//F(38)
{0x3E,0x41,0x49,0x49,0x7A},//G(39)
{0x7F,0x08,0x08,0x08,0x7F},//H(40)
{0x00,0x41,0x7F,0x41,0x00},//I(41)
{0x20,0x40,0x41,0x3F,0x01},//J(42)
{0x7F,0x08,0x14,0x22,0x41},//K(43)
{0x7F,0x40,0x40,0x40,0x40},//L(44)
{0x7F,0x02,0x04,0x02,0x7F},//M(45)
{0x7F,0x04,0x08,0x10,0x7F},//N(46)
{0x3E,0x41,0x41,0x41,0x3E},//O(47)
{0x7F,0x09,0x09,0x09,0x06},//P(48)
{0x3E,0x41,0x51,0x21,0x5E},//Q(49)
{0x7F,0x09,0x19,0x29,0x46},//R(50)
{0x46,0x49,0x49,0x49,0x31},//S(51)
{0x01,0x01,0x7F,0x01,0x01},//T(52)
{0x3F,0x40,0x40,0x40,0x3F},//U(53)
{0x1F,0x20,0x40,0x20,0x1F},//V(54)
{0x3F,0x40,0x38,0x40,0x3F},//W(55)
{0x63,0x14,0x08,0x14,0x63},//X(56)
{0x03,0x04,0x78,0x04,0x03},//Y(57)
{0x61,0x51,0x49,0x45,0x43},//Z(58)
{0x00,0x7F,0x41,0x41,0x00},//[(59)
{0x15,0x16,0x7C,0x16,0x15},//\(60)
{0x00,0x41,0x41,0x7F,0x00},//](61)
{0x04,0x02,0x01,0x02,0x04},//^(62)
{0x40,0x40,0x40,0x40,0x40},//_(63)
{0x00,0x01,0x02,0x04,0x00},//`(64)
{0x20,0x54,0x54,0x54,0x78},//a(65)
{0x7F,0x48,0x44,0x44,0x38},//b(66)
{0x38,0x44,0x44,0x44,0x20},//c(67)
{0x38,0x44,0x44,0x48,0x7F},//d(68)
{0x38,0x54,0x54,0x54,0x18},//e(69)
{0x08,0x7E,0x09,0x01,0x02},//f(70)
{0x0C,0x52,0x52,0x52,0x3E},//g(71)
{0x7F,0x08,0x04,0x04,0x78},//h(72)
{0x00,0x44,0x7D,0x40,0x00},//i(73)
{0x20,0x40,0x44,0x3D,0x00},//j(74)
{0x7F,0x10,0x28,0x44,0x00},//k(75)
{0x00,0x41,0x7F,0x40,0x00},//l(76)
{0x7E,0x02,0x0C,0x02,0x7C},//m(77)
{0x7E,0x04,0x02,0x02,0x7C},//n(78)
{0x38,0x44,0x44,0x44,0x38},//o(79)
{0x7C,0x14,0x14,0x14,0x08},//p(80)
{0x08,0x14,0x14,0x18,0x7C},//q(81)
{0x7C,0x08,0x04,0x04,0x08},//r(82)
{0x48,0x54,0x54,0x54,0x20},//s(83)
{0x04,0x3F,0x44,0x40,0x20},//t(84)
{0x3C,0x40,0x40,0x20,0x7C},//u(85)
{0x1C,0x20,0x40,0x20,0x1C},//v(86)
{0x3C,0x40,0x30,0x40,0x3C},//w(87)
{0x44,0x28,0x10,0x28,0x44},//x(88)
{0x0C,0x50,0x50,0x50,0x3C},//y(89)
{0x44,0x64,0x54,0x4C,0x44},//z(90)
{0x00,0x08,0x36,0x41,0x00},//{(91)
{0x00,0x00,0x7F,0x00,0x00},//|(92)
{0x00,0x41,0x36,0x08,0x00},//}(93)
{0x08,0x04,0x08,0x10,0x08},//~(94)
{0x08,0x08,0x2A,0x1C,0x08},//→(127)
{0x08,0x1C,0x2A,0x08,0x08},//←(128)
{0x04,0x02,0x7F,0x02,0x04},//↑(129)
{0x10,0x20,0x7F,0x20,0x10}};//↓(130)

/*--------------------------------------------------------------*/
//指令宏定义
#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行开始往屏幕上显示
/*--------------------------------------------------------------*/
//便于理解宏定义
//清屏参数
#define LSCR        0        //左屏
#define RSCR        1        //右屏
#define ASCR        2        //全屏
/*--------------------------------------------------------------*/
//数据接口定义
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   //数据传输端口

/*--------------------------------------------------------------*/
//选屏宏定义
#define LCD_sel_left   {CS2 = 0;        CS1 = 1;}
#define LCD_sel_right  {CS2 = 1;        CS1 = 0;}
#define LCD_sel_all   {CS2 = 1;        CS1 = 1;}
/*--------------------------------------------------------------*/
#define Hard_RST   {RST = 0; RST = 1;}                        //硬件复位
/*--------------------------------------------------------------*/
//函数声明(私有)
void Delay(uint ms)
{
   for(i=0;i<ms;i++)
      for(j=0;j<300;j++);
}
/*--------------------------------------------------------------*/
//读出指令(状态)

uchar LCD_read_cmd(void)
{
   uchar read_cmd;
   Data_IO = 0xff;                //输入
   RW = 1;                                //读出
   RS = 0;                                //指令
   E  = 1;                //高电平读出
   read_cmd = Data_IO;        //指令

   return (read_cmd);
}
/*--------------------------------------------------------------*/
//读出数据
//先只须空读一次, 以后接着就无须空读
//空读之后读出的数据都是有效的!!!
uchar LCD_read_dat(void)
{
   uchar read_dat;
   Data_IO = 0xff;                //输入
   RS = 1;                                //数据
   RW = 1;                                //读出       
   E  = 1;                        //高电平读出       
   read_dat = Data_IO;        //数据               
   return (read_dat);
}

/*--------------------------------------------------------------*/
//检查忙标志位

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(1);
   E  = 0;                        //下降沿写入
}


/*--------------------------------------------------------------*/
//写入数据
void LCD_write_dat(uchar dat)
{
    LCD_check_busy();
    RW = 0;                        //写入       
    RS = 1;                //数据
    Data_IO = dat;        //数据
    E  = 1;       
    Delay(1);
    E  = 0;                        //下降沿写入
}
/*--------------------------------------------------------------*/
//显示清屏
void LCD_clr_scr(uchar sel_dat)
{
     uchar i, j;
       
     if(sel_dat == 0)       LCD_sel_left
     else if(sel_dat == 1)  LCD_sel_right
     else if(sel_dat == 2)  LCD_sel_all
     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*1)
//液晶规划:
//x: 0 - 7        (行)
//y: 0 -127        (列)
void LCD_byte_pos(uchar x, uchar y)
{
     if(y < 64)           LCD_sel_left                //左半屏
     else {y -= 64; LCD_sel_right}        //右半屏
     LCD_write_cmd(X_Page_Addr + x);        //页地址0-7
     LCD_write_cmd(Y_Col_Addr + y);        //列地址0-63
}
/*--------------------------------------------------------------*/
//液晶字符输出(8*5字体)
//x: 0 - 7        (行)
//y: 0 -25        (列)
void LCD_print(uchar x, uchar y, uchar c_dat)
{
     uchar i;
       
     y = y * 5;                                       
     if(y<125)
       for(i = 0; i < 5; i++){
          LCD_byte_pos(x,y+i);
          LCD_write_dat(Font_code[c_dat - 32]);
       }
}
/*--------------------------------------------------------------*/
//液晶字符串输出
//x: 0 - 7        (行)
//y: 0 -25        (列)
void LCD_prints(uchar x, uchar y, uchar *s_dat)
{
    while(*s_dat) {LCD_print(x, y++, *s_dat++);}
}
/*--------------------------------------------------------------*/
//初始化LCD128*64
//清除所有显示DDRAM, 清除画面内容, 所有地址指针回0
void LCD_init_12864(void)       
{
     Hard_RST
     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);        //开启显示
}
/*--------------------------------------------------------------*/
//显示Run模式
void Disp_Run()
{
    LCD_prints(0, 0, "Run Modes:");
    LCD_prints(1, 2, "Charge&AutoRun");
    LCD_prints(2, 2, "Remote Control");
    LCD_prints(3, 2, "Demo Auto-Run");
    LCD_prints(4, 2, "Self-Test");
}
/*--------------------------------------------------------------*/

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)
{
    XBR2=0x40;
    P3MDOUT = 0x3F;
    P74OUT  =0x03;
}
/*--------------------------------------------------------------*/
//主函数
void main(void)
{       
    WDTCN=0xDE;
    WDTCN=0xAD;                        //关看门狗
    SYSCLK_Init();
    PORT_Init();
    LCD_init_12864();                                                                     
    do{
        LCD_prints(1, 2, "Charge&AutoRun");
        Delay(10000);       
    }while(1);
}

/*--------------------------------------------------------------*/

出0入0汤圆

发表于 2010-1-23 22:31:40 | 显示全部楼层
我最近也刚搞定12864,不过我是使用串行接法,用的是C8051F330D

(原文件名:IMG0064A.jpg)

出0入0汤圆

 楼主| 发表于 2010-1-24 15:19:21 | 显示全部楼层
回复【6楼】martal
-----------------------------------------------------------------------
我的12864不带字库,倒无所谓串并行接法了。现在我只是感觉是读函数的问题,因为凡是用到读函数,不管是读指令还是读数据,都不会显示,编了个反白显示的函数试了一下,连个乱码都没显示出来,搞的我心里拔凉拔凉的。关键是不知道怎么改,哎

出0入0汤圆

发表于 2010-1-24 18:04:24 | 显示全部楼层
mark.......

出0入0汤圆

发表于 2010-5-8 16:37:47 | 显示全部楼层
回复【7楼】jzlxue
-----------------------------------------------------------------------

我做过;020的128#64的液晶是串口的;显示4路 a/d值和汉字;可提供源程序,代码和连接;
连系:xiaonangci@yahoo.com.cn
13621048443

出0入0汤圆

发表于 2011-9-11 17:05:40 | 显示全部楼层
呵呵

出0入0汤圆

发表于 2011-11-9 22:49:51 | 显示全部楼层
回复【楼主位】jzlxue
-----------------------------------------------------------------------

c8051f的io口3.3v能直接驱动12864吗?

出0入0汤圆

发表于 2012-2-20 19:56:12 | 显示全部楼层
学习了,呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-1 06:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表