用的是STC8F2K16S2单片机
连接液晶显示 SEG9-SEG27 COM0-COM3
#include "STC8F.H"
#include "absacc.h"
#include "intrins.h"
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
#define BIAS 0X52 //必须跟硬件电路的COM匹配,1个或者2个COM 0x42 3个COM 0X4A 4个COM 0x52 1/3LCD驱动器偏压 4个公共端口COM
#define RC256 0X30
#define SYSTEN 0x02
#define SYSDIS 0x00
#define LCDON 0X06
void sendbitHT1621(uchar nbit,uchar n);//发送一个字节中的n位到HT1621里,驱动程序的最底层部分
void write_com(uchar cmdcode);//写命令到LCD
void init_lcd();//初始化LCD屏
void seg_display(uchar col,uchar pag);//显示基本单位点
void scerrn_clear();//清空屏幕的内容
void delay(); //5s
//说明:凡是输出IO后缀都是_dr,凡是输入后缀都是_sr
sbit ht162x_data_dr=P0^0;
sbit ht162x_cs_dr=P0^2;
sbit ht162x_wr_dr=P0^3;
void main()
{
init_lcd();
}
//发送一个字节中的N位到HT1621里,驱动程序的最底层部分//
void sendbitHT1621(uchar nbit,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
ht162x_wr_dr=0;
if(nbit&0x80) //判断最高位
{
ht162x_data_dr=1;
}
else
{
ht162x_data_dr=0;
}
_nop_();
_nop_();
_nop_();
ht162x_wr_dr=1;
_nop_();
_nop_();
_nop_();
nbit<<=1;
}
}
//写命令到LCD,驱动液晶程序的一部分//
void write_com(uchar cmdcode)
{
ht162x_cs_dr=0; //选通HT1621
_nop_();
_nop_();
sendbitHT1621(0x80,4); //写入命令
sendbitHT1621(cmdcode,8); //写入控制命令
_nop_();
_nop_();
ht162x_cs_dr=1;
_nop_();
_nop_();
_nop_();
}
void init_lcd()
{
ht162x_data_dr=1;
ht162x_cs_dr=1;
ht162x_wr_dr=1;
write_com(SYSTEN); // 打开系统振荡器
write_com(RC256); //启动内部256K RC振荡器
write_com(BIAS); //1/3LCD驱动器偏压 4个公共端口COM
write_com(LCDON); //开启LCD
}
//核心内容 显示基本单位点,col代表X轴,X轴的数据用位来表示,一个字节中的高4位来表示,pag表示Y轴
void seg_display(uchar col,uchar pag)
{
// pag<<=2;
ht162x_cs_dr=0;
_nop_();
_nop_();
sendbitHT1621(0XA0,3); //发送写数据模式 高位101 101为6 位RAM 地址,
sendbitHT1621(pag<<2,6); //写入地址数据
sendbitHT1621(col,4); //写入数据
ht162x_cs_dr=1;
_nop_();
_nop_();
}
//清空屏幕内容
void screen_clrar()
{
uchar i;
uchar y=0;
for(i=0;i<32;i++)
{
seg_display(0X00,y);
y=y+1;
}
}
注:这个还有一个毛病就是每次烧完程序之后 要断电很久屏幕才会发生变化,这个也搞不清是什么原因[img |