本帖最后由 beidewensike 于 2012-5-24 13:20 编辑
//----------------------------------------------------
#include <stdio.h>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
uchar ContrastLevel; // 对比度参数变量
uchar bdata GrayLevel4; //灰度变量,D5,D4为前景 {MOD}D1,D0背景 {MOD},该变量可为位操作之变量
sbit Fgraybit0 = GrayLevel4^4;//前景 {MOD}数值
sbit Fgraybit1 = GrayLevel4^5;
sbit Ggraybit0 = GrayLevel4^0;//背景 {MOD}数值
sbit Ggraybit1 = GrayLevel4^1;
uchar bdata graydata0,graydata1;// 灰度中间变量,位操作
sbit grayd0bit7 = graydata0^7;
sbit grayd1bit7 = graydata1^7;
unsigned long int v1;
//接口定义
//1602的数据接口为P0
sfr ADC_CONTR =0xBC; //ADC控制寄存器
sfr ADC_RES =0xBD; //ADC高8位结果寄存器
sfr ADC_RESL =0xBE; //ADC低2位结果寄存器
sfr P1ASF =0x9D; //ADC第二功能控制寄存器
unsigned char xdata shuzi[]={'0','1','2','3','4','5','6','7','8','9'};
uint ee=5;
uint v7=9;
//------------- ASCII字符库----------------------------------------------------------------
//说明:该字库为5*7点阵字符字模库,但字库格式为8*8点阵字模数据,第8行为行间距,
// 第6-8列为字间距。可以使用6*8点阵、7*8点阵、8*8点阵形式的字符显示
uint code ASCIITAB[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*" "=00H*/
0x00,0x00,0x00,0x4F,0x00,0x00,0x00,0x00, /*"!"=01H*/
0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00, /*"""=02h*/
0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00, /*"#"=03h*/
0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00, /*"$"=04h*/
0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00, /*"%"=05h*/
0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00, /*"&"=06h*/
0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00, /*"'"=07h*/
0x00,0x00,0x1C,0x22,0x41,0x00,0x00,0x00, /*"("=08h*/
0x00,0x00,0x41,0x22,0x1C,0x00,0x00,0x00, /*")"=09h*/
0x00,0x14,0x08,0x3E,0x08,0x14,0x00,0x00, /*"*"=0Ah*/
0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, /*"+"=0Bh*/
0x00,0x00,0x50,0x30,0x00,0x00,0x00,0x00, /*";"=0Ch*/
0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /*"-"=0Dh*/
0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00, /*"."=0Eh*/
0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00, /*"/"=0Fh*/
0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00, /*"0"=10h*/
0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00, /*"1"=11h*/
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00, /*"2"=12h*/
0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00, /*"3"=13h*/
0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00, /*"4"=14h*/
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, /*"5"=15h*/
0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00, /*"6"=16h*/
0x00,0x01,0x01,0x79,0x05,0x03,0x00,0x00, /*"7"=17h*/
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, /*"8"=18h*/
0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00, /*"9"=19h*/
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00, /*":"=1Ah*/
0x00,0x00,0x56,0x36,0x00,0x00,0x00,0x00, /*";"=1Bh*/
0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00, /*"<"=1Ch*/
0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00, /*"="=1Dh*/
0x00,0x00,0x41,0x22,0x14,0x08,0x00,0x00, /*">"=1Eh*/
0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00, /*"?"=1Fh*/
0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00, /*"@"=20h*/
0x00,0x7E,0x11,0x11,0x11,0x7E,0x00,0x00, /*"A"=21h*/
0x00,0x41,0x7F,0x49,0x49,0x36,0x00,0x00, /*"B"=22h*/
0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00, /*"C"=23h*/
0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00, /*"D"=24h*/
0x00,0x7F,0x49,0x49,0x49,0x49,0x00,0x00, /*"E"=25h*/
0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00, /*"F"=26h*/
0x00,0x3E,0x41,0x41,0x49,0x7A,0x00,0x00, /*"G"=27h*/
0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00, /*"h"=28h*/
0x00,0x00,0x41,0x7F,0x41,0x00,0x00,0x00, /*"I"=29h*/
0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00, /*"J"=2Ah*/
0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00, /*"K"=2Bh*/
0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00, /*"L"=2Ch*/
0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00, /*"M"=2Dh*/
0x00,0x7F,0x06,0x08,0x30,0x7F,0x00,0x00, /*"N"=2Eh*/
0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00, /*"O"=2Fh*/
0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00, /*"P"=30h*/
0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00, /*"Q"=31h*/
0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00, /*"R"=32h*/
0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00, /*"S"=33h*/
0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00, /*"T"=34h*/
0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00, /*"U"=35h*/
0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00, /*"V"=36h*/
0x00,0x7F,0x20,0x18,0x20,0x7F,0x00,0x00, /*"W"=37h*/
0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00, /*"X"=38h*/
0x00,0x07,0x08,0x70,0x08,0x07,0x00,0x00, /*"Y"=39h*/
0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00, /*"Z"=3Ah*/
0x00,0x00,0x7F,0x41,0x41,0x00,0x00,0x00, /*"["=3Bh*/
0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00, /*""=3Ch*/
0x00,0x00,0x41,0x41,0x7F,0x00,0x00,0x00, /*"]"=3Dh*/
0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00, /*"^"=3Eh*/
0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00, /*"_"=3Fh*/
0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00, /*"`"=40h*/
0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00, /*"a"=41h*/
0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00, /*"b"=42h*/
0x00,0x38,0x44,0x44,0x44,0x28,0x00,0x00, /*"c"=43h*/
0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00, /*"d"=44h*/
0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00, /*"e"=45h*/
0x00,0x00,0x08,0x7E,0x09,0x02,0x00,0x00, /*"f"=46h*/
0x00,0x0C,0x52,0x52,0x4C,0x3E,0x00,0x00, /*"g"=47h*/
0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00, /*"h"=48h*/
0x00,0x00,0x44,0x7D,0x40,0x00,0x00,0x00, /*"i"=49h*/
0x00,0x20,0x40,0x44,0x3D,0x00,0x00,0x00, /*"j"=4Ah*/
0x00,0x00,0x7F,0x10,0x28,0x44,0x00,0x00, /*"k"=4Bh*/
0x00,0x00,0x41,0x7F,0x40,0x00,0x00,0x00, /*"l"=4Ch*/
0x00,0x7C,0x04,0x78,0x04,0x78,0x00,0x00, /*"m"=4Dh*/
0x00,0x7C,0x08,0x04,0x04,0x78,0x00,0x00, /*"n"=4Eh*/
0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00, /*"o'=4Fh*/
0x00,0x7E,0x0C,0x12,0x12,0x0C,0x00,0x00, /*"p"=50h*/
0x00,0x0C,0x12,0x12,0x0C,0x7E,0x00,0x00, /*"q"=51h*/
0x00,0x7C,0x08,0x04,0x04,0x08,0x00,0x00, /*"r"=52h*/
0x00,0x58,0x54,0x54,0x54,0x64,0x00,0x00, /*"s"=53h*/
0x00,0x04,0x3F,0x44,0x40,0x20,0x00,0x00, /*"t"=54h*/
0x00,0x3C,0x40,0x40,0x3C,0x40,0x00,0x00, /*"u"=55h*/
0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00, /*"v"=56h*/
0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00, /*"w"=57h*/
0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00, /*"x"=58h*/
0x00,0x1C,0xA0,0xA0,0x90,0x7C,0x00,0x00, /*"y"=59h*/
0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00, /*"z"=5Ah*/
0x00,0x00,0x08,0x36,0x41,0x00,0x00,0x00, /*"{"=5Bh*/
0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00, /*"|"=5Ch*/
0x00,0x00,0x41,0x36,0x08,0x00,0x00,0x00, /*"}"=5Dh*/
0x00,0x02,0x01,0x02,0x04,0x02,0x00,0x00, /*"~"=5Fh*/
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 /*" "=0x60*/
};
char code cont[]=
//说明:该字库为8*8点阵数字字模库,
{
0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00, /*"0"=10h*/
0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00, /*"1"=11h*/
0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00, /*"2"=12h*/
0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00, /*"3"=13h*/
0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00, /*"4"=14h*/
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, /*"5"=15h*/
0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00, /*"6"=16h*/
0x00,0x01,0x01,0x79,0x05,0x03,0x00,0x00, /*"7"=17h*/
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, /*"8"=18h*/
0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00, /*"9"=19h*/
};
//-----------------------------------
// I/O寻址方式驱动子程序(80mode)
#define LCDBUS P0
sbit RS = P3^6;
sbit _CS = P3^4;
sbit _RST = P3^5;
sbit _WR = P3^7;
sbit _RD = P3^2;
//--------指令代码传送函数------------------
void SdCmd(uchar Command)
{
RS = 0; // 设置指令通道
_CS = 0; // 选通模块
LCDBUS = Command; // 指令送数据口
_WR = 0; // 写操作形成
_nop_();
_WR = 1;
_CS = 1; // 封锁模块
}
//-----显示数据传送函数--------------------------
void SdData(uchar DData)
{
RS = 1; // 选择数据通道
_CS = 0; // 选通模块
LCDBUS = DData; // 数据送数据口
_WR = 0; // 写操作形成
_WR = 1;
_CS = 1; // 封锁模块
}
//-------显示数据读取函数-------------------------
uchar RdData()
{
uchar DData;
RS = 1; // 选择数据通道
_CS = 0; // 选通模块
LCDBUS=0xff;
_RD = 0; // 读操作形成
DData = LCDBUS; // 读数据
_RD = 1; // 读操作结束
_CS=1; // 封锁模块
return(DData); // 返回数据值
}
//----------------------------------------
// 功能子程序
//----------------------------------------
//-----灰度数据生成函数---------
void SdGraydata(uchar MonoData)
{
uchar i;
graydata0=0;
graydata1=0;
for (i=0;i<8;i++)
{
graydata0=graydata0>>1;
graydata1=graydata1>>1;
switch (MonoData&0x01)
{
case 1 : grayd1bit7=Fgraybit1;grayd0bit7=Fgraybit0;break;
case 0 : grayd1bit7=Ggraybit1;grayd0bit7=Ggraybit0;break;
}
MonoData=MonoData>>1;
}
SdData(graydata1);
SdData(graydata0);
}
//------ASCII字符写入函数---------------
void PrintASCII(uchar x,y,uchar *pstr)
// 坐标(x,y),x为水平方向像素列;y为垂直方向字符行(8点像素/行)
{
uchar j;
uint addr;
SdCmd(y|0xb0); // 设置页地址
SdCmd((x>>4)|0x10); // 设置列地址高4位
SdCmd(x&0x0f); // 设置列地址低4位
while(*pstr>0)
{
addr=*pstr++; // 取字符代码
addr=(addr-0x20)*8; // 计算字符字模起始地址
for (j=0;j<6;j++) // 设置循环量,显示6*8点阵字符
{
SdGraydata(ASCIITAB[addr+j]); // 写字模数据
}
}
}
//------数字(8*8)字符写入函数-----------------
void PrintNUM(uchar x,y,uint ss)
// 坐标(x,y),x为水平方向像素列;y为垂直方向字符行(8点像素/行)
{
uint j;
while(ss>=0)
{
SdCmd(y|0xb0); // 设置页地址
SdCmd((x>>4)|0x10); // 设置列地址高4位
SdCmd(x&0x0f); // 设置列地址低4位
for (j=0;j<8;j++) // 写8字节字模数据
{
SdGraydata(cont[ss*8+j]); // 写字模数据
}
}
}
//-----------------------------------
// 对比度调节程序 Contrast control
//-----------------------------------
//-----对比度增强函数-------------
void LCD_Darker(void)
// 对比度参数ConTrastLevel初始值在初始化程序中设置
{
if (ContrastLevel<0x3F) // 限制上限值
{
ContrastLevel++; // 对比度参数加1
}
SdCmd(0x81); // 对比度设置指令代码
SdCmd(ContrastLevel); // 写入对比度值
}
//-----对比度减弱函数---------------
void LCD_Lighter(void)
// 对比度参数ConTrastLevel初始值在初始化程序中设置
{
if (ContrastLevel>0x00) // 限制下限值
{
ContrastLevel--; // 对比度参数减1
}
SdCmd(0x81); // 对比度设置指令代码
SdCmd(ContrastLevel); // 写入对比度值
}
//----清屏函数-----------------
void ClearRAM()
{
uchar i,j;
for (i=0;i<12;i++) // 循环写8页
{
SdCmd(i|0xb0); // 页地址设置
SdCmd(0x10); // 列地址高4位
SdCmd(0x00); // 列地址低4位
for(j=0;j<128;j++) // 循环写128单元
{
SdData(0x00); // 数据设置为0
SdData(0x00);
}
}
}
//----------灰度清屏函数------------------------
void GrayRAM(uchar x,y,width,high)
{
uchar i,j,k;
k=GrayLevel4&0x03;
for (i=0;i<high;i++) // 循环写8页
{
SdCmd(y|0xb0); // 设置页地址
SdCmd((x>>4)|0x10); // 设置列地址高4位
SdCmd(x&0x0f); // 设置列地址低4位
for(j=0;j<width;j++) // 循环写128单元
{
switch (k)
{
case 0 : SdData(0x00); SdData(0x00); break;
case 1 : SdData(0x00); SdData(0xff); break;
case 2 : SdData(0xff); SdData(0x00); break;
case 3 : SdData(0xff); SdData(0xff); break;
}
}
y=y+1; // 页地址修正
}
}
//-----------------------------------
// 初始化函数
//-----------------------------------
void initLCDM(void)
{
//------对比度参数初始值设置-----------------------------------
ContrastLevel=0x20; // 对比度参数初始化设置
//------显示设置----------------------------------------------
SdCmd(0xa1); // ADC=1,RAM列地址与列驱动逆顺序
SdCmd(0xc8); // SHL=1,行驱动方向为反向
SdCmd(0x44); SdCmd(0x10); // COM0寄存器=10H
SdCmd(0x48); SdCmd(0x60); // 占空比设置1/96
SdCmd(0x40); SdCmd(0x00); // 显示起始行=0
SdCmd(0xab); // 启用内部振荡器
//SdCmd(0x4c); SdCmd(0x00); // 设置M信号周期
//-------LCD电源设置-------------------------------------------
SdCmd(0x66); // 5X倍压
SdCmd(0x27); // 调节器电阻比设置
SdCmd(0x81);SdCmd(ContrastLevel);// 对比度设置
SdCmd(0x54); // 偏压1/9
SdCmd(0x2f); // 启用内部LCD驱动电源
//-------灰度设置---------------------------------------------
SdCmd(0x93); // 设置灰度驱动方式为4FRC+15PWM
SdCmd(0x88); SdCmd(0x00); // 设置W_FR2,1灰度寄存器值
SdCmd(0x89); SdCmd(0x00); // 设置W_FR4,3灰度寄存器值
SdCmd(0x8a); SdCmd(0x66); // 设置L_FR2,1灰度寄存器值
SdCmd(0x8b); SdCmd(0x66); // 设置L_FR4,3灰度寄存器值
SdCmd(0x8c); SdCmd(0x88); // 设置D_FR2,1灰度寄存器值
SdCmd(0x8d); SdCmd(0x88); // 设置D_FR4,3灰度寄存器值
SdCmd(0x8e); SdCmd(0xff); // 设置B_FR2,1灰度寄存器值
SdCmd(0x8f); SdCmd(0xff); // 设置B_FR4,3灰度寄存器值
//-------开显示------------------------------------------------
SdCmd(0xa6); // 正向显示
SdCmd(0xaf); // 开显示
}
//-----------------------------------
// Main Program
//-----------------------------------
void main()
{
uchar code dis6[]={0x01,0x02,0x03,0x04,0x05,0x0a,0x0b,0x00};
_CS =1;
RS =1;
_RD =1;
_WR =1;
RST =1; // hardware reset LCD module
_RST=0;
delayms(10);
_RST=1;
delayms(500);
initLCDM();
delayms(300);
ClearRAM();
// GrayLevel4=0x30;
// PrintGB(9,1,dis6);
GrayLevel4=0x30;
PrintASCII(4,0,"V1= ");
GrayLevel4=0x30;
PrintASCII(90,0,"D ");
GrayLevel4=0x30;
PrintASCII(4,2,"89798 ");
GrayLevel4=0x30;
PrintASCII(4,4,"0098779");
GrayLevel4=0x30;
PrintNUM(8,6,7);
GrayLevel4=0x30;
PrintNUM(6,8,3);
delayms(300000);
}
//end of program
以上printNUM()函数调用两次只显示一个结果。。。而printASCII就可以正常显示多个结果!!!!这是为什么啊!!!!???望各位大虾帮忙解答,小弟不胜感激!!!
89798
0098779
7
一周热门 更多>