历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2020年09月22日 | 单片机12864 c程序

2020-09-22 来源:eefocus

单片机12864 c程序-MSP430与12864连接驱动程序(KS0108)

#i nclude "MSP430x14x.h" // Standard EquaTIons
#i nclude "math.h"
#i nclude "stdlib.h"
#i nclude "stdio.h"
#i nclude "string.h"
#i nclude "ctype.h"
#i nclude "HZTable.h"
#i nclude "ASCII816.h"
#define uint unsigned int
#define uchar unsigned char
//**********************************************
#define RS BIT0
#define RW BIT1
#define E BIT2
#define CS1 BIT3
#define CS2 BIT4
#define RST BIT5
#define EL BIT6 //背光
//数据线:p4口 ,控制线: p5口
//**********************************************
uchar cradd1,cradd2;
uchar item1[5]={0,1,2,3,50}; //欢迎使用
uchar item2[5]={4,5,6,7,50}; //请等待……

//=======================================================
void short_delay(uint i)
{ uint j;
for(j=0;j<=i;j++);
}
void delayms(uchar TIckms)
{ uchar count,i;
_NOP(); 
_NOP(); 
_NOP();

for(i=TIckms;i>0;i--)
{ for(count=0;count<=58;count++) {;}
_NOP();
}
}
//**************************************************
void prl0(uchar com1)// 写指令代码子程序(左)

P5DIR|=0X7F; //P5为输出口
P5OUT|=CS1; //csa=1 
P5OUT&=~CS2; //csb=0
P5OUT&=~RS; 
P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
P4DIR=0x00; //P4口为输入口
do
{
P5OUT|=E; //E=1
cradd1=P4IN;
P5OUT&=~E; //E=0 
}
while((cradd1&0x80)!=0);
P5OUT&=~RW; //rw=0
P4DIR=0xff; //P4口为输出口
P4OUT=com1;
P5OUT|=E; //E=1
P5OUT&=~E; //E=0 
}
//**************************************************
void prl1(uchar dat1)// 写显示数据子程序(左)

P5DIR|=0X7F; //P5为输出口
P5OUT|=CS1; //csa=1 
P5OUT&=~CS2; //csb=0
P5OUT&=~RS; 
P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
P4DIR=0x00; //P4口为输入口
do
{
P5OUT|=E; //E=1
cradd1=P4IN;
P5OUT&=~E; //E=0 
}
while((cradd1&0x80)!=0);
P5OUT|=RS; //rs=1 
P5OUT&=~RW; //rw=0
P4DIR=0xff; //P4口为输出口
P4OUT=dat1;
P5OUT|=E; //E=1
P5OUT&=~E; //E=0 
}
//**************************************************
void prr0(uchar com2)// 写指令代码子程序(右)

P5DIR|=0X7F; //P5为输出口
P5OUT&=~CS1; //csa=0 
P5OUT|=CS2; //csb=1
P5OUT&=~RS; 
P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
P4DIR=0x00; //P4口为输入口
do
{
P5OUT|=E; //E=1
cradd1=P4IN;
P5OUT&=~E; //E=0 
}
while((cradd1&0x80)!=0);
P5OUT&=~RW; //rw=0
P4DIR=0xff; //P4口为输出口
P4OUT=com2;
P5OUT|=E; //E=1
P5OUT&=~E; //E=0 
}
//*************************************************
void prr1(uchar dat2)// 写显示数据子程序(右)

P5DIR|=0X7F; //P5为输出口
P5OUT&=~CS1; //csa=0 
P5OUT|=CS2; //csb=1
P5OUT&=~RS; 
P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
P4DIR=0x00; //P4口为输入口
do
{
P5OUT|=E; //E=1
cradd1=P4IN;
P5OUT&=~E; //E=0 
}
while((cradd1&0x80)!=0);
P5OUT|=RS; //rs=1 
P5OUT&=~RW; //rw=0
P4DIR=0xff; //P4口为输出口
P4OUT=dat2;
P5OUT|=E; //E=1
P5OUT&=~E; //E=0 
}
//****************************************************
//读显示数据子程序 (左屏)
//****************************************************
uchar ReadDatal(void)
{
uchar Rdata;
P5DIR|=0X7F; //P5为输出口
P5OUT|=CS1; //csa=1 
P5OUT&=~CS2; //csb=0
P5OUT&=~RS; 
P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
P4DIR=0x00; //P4口为输入口
do
{
P5OUT|=E; //E=1
cradd1=P4IN;
P5OUT&=~E; //E=0 
}
while((cradd1&0x80)!=0);

P5OUT|=RS; //RS=1 
//P5OUT|=RW; //R/W=1
P5OUT|=E; //E=1
Rdata=P4IN;
P5OUT&=~E; //E=0 
return Rdata; 
}
//****************************************************
//读显示数据子程序 (右屏)
//****************************************************
uchar ReadDatar(void)
{
uchar Rdata;
P5DIR|=0X7F; //P5为输出口
P5OUT&=~CS1; //csa=0 
P5OUT|=CS2; //csb=1
P5OUT&=~RS; 
P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
P4DIR=0x00; //P4口为输入口
do
{
P5OUT|=E; //E=1
cradd1=P4IN;
P5OUT&=~E; //E=0 
}
while((cradd1&0x80)!=0);

P5OUT|=RS; //RS=1 
//P5OUT|=RW; //R/W=1
P5OUT|=E; //E=1
Rdata=P4IN;
P5OUT&=~E; //E=0 
return Rdata; 
}
//**********************************************
//**********************************************
void clsr(void) //清屏 
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8); //设置页地址
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++) //设置列地址
{ prl1(0x00); //写0x00 
prr1(0x00);
}
}
}
//**********************************************
void allon(void) //满屏
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8);
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0xff); //写0xff
prr1(0xff);
}
}
}
//***********************************************
void stripe(void)
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8);
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0xaa);
prr1(0xaa); // 写0xaa
}
}
}
//***********************************************
void stripe1(void)
{ uchar i,j;
for(i=0;i<8;i++)
{ prl0(i|0xb8);
prr0(i|0xb8);
prl0(0x40);
prr0(0x40);
for(j=0;j<64;j++)
{ prl1(0x55); // 写0x55
prr1(0x55);
}
}
}

//***************************************************

//***************************************************
void hzw_pr(uchar colum2,uchar page2,uchar code2)// 写汉字 
//page2:页 colum2:列 code2:代码 code2=0,1,2,3……表示第几个汉字
{ uchar i,j,colum;
uchar *hzp; 

uchar flag;
hzp=&HZTable[code2][0]; 
for(j=0;j<2;j++)
{ prl0(page2|0xb8); //页
prr0(page2|0xb8);
colum=colum2;
if(colum2>63) //右屏
{ colum=colum-64;
prr0(colum|0x40); 
flag=1;
}
else //左屏
{prl0(colum|0x40);
flag=0;
}
//*********************
for(i=0;i<16;i++)

if(flag==0)
{
prl1(*hzp);
}
else
{prr1(*hzp);}
hzp++;
if(colum==64) //列=64
{
colum=0;
if(flag==0)
{
flag=1;
prr0(colum|0x40);
}
else{break;}
}
colum++;
}
page2++;
}
}
//***********************************************
void w_hzstr(uchar colum4,uchar page4,uchar *str1)// 写汉字字符串 
{
while(*str1!=50)

hzw_pr( colum4, page4,*str1) ;
colum4=colum4+16;
str1++;
}
}
//***************************************************
//init_xt2; 初始化XT2 晶振为4MHZ
//*****************************************************
void init_xt2(void)
{
unsigned int iq0;

//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
} while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振

BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2,
BCSCTL2 |=DIVM_1; //MCLK 2分频SMCLK=MCLK=2MHZ
}
//***********************************************
//主程序 
//***********************************************

void main(void)

uchar a;
// uchar i,j;
WDTCTL=WDTPW+WDTHOLD; 
init_xt2();
P5DIR|=0X7F; //P5为输出口
P5OUT&=~RST; //rst=0 
delayms(10); //1ms
P5OUT|=RST; //rst=1
P5OUT&=~EL; //EL=0 背光=0 
do

prl0(0xc0);prr0(0xc0); //显示开始行
prl0(0x3f);prr0(0x3f); //开显示
//P5OUT&=~EL; //EL=0 背光=0 
//******************************************************
clsr(); // clear screen 
//写汉字字符串1 欢迎使用 
//写汉字字符串2 请等待… 
w_hzstr(32,2,item1);w_hzstr(32,5,item2); 
delayms(100); 
for(a=0;a<50;a++)
{ delayms(100);}

prl0(0xc0);prr0(0xc0);


clsr(); 

allon(); // fill screen 

delayms(100);
for(a=0;a<25;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
clsr(); // clear screen 
delayms(100);
for(a=0;a<25;a++)
{ delayms(100);}


/* stripe screen */
prl0(0xc0);prr0(0xc0);
stripe();
delayms(100);
for(a=0;a<20;a++)
{ delayms(100);}
prl0(0xc0);prr0(0xc0);
stripe1();
delayms(100);
for(a=0;a<50;a++)
{ delayms(100);}

    }while(1);
}

12864液晶控制程序

//注意字符或图片取模方式为字节倒序,纵向取模

//字模精灵下载

//2005.6.修改了部分显示函数,使用时不再用考虑左右屏
#include "lcdriver.h"

//lcdriver.c

void Delay(long v)
{
        while(--v);
}

 

void Write_Command(uchar cmdcode,uchar cs1,uchar cs2) //写命令到LCD
{
 
 CS1=(cs1?1:0);
 CS2=(cs2?1:0);
  
 DI=0;
 RW=0;
 lcd_data_bus=cmdcode;//写命令

 E=0;
 Delay(1);
 E=1; 
 E=0;

}

void Write_Data(uchar disp_data,uchar cs1,uchar cs2) //写数据到LCD

 CS1=(cs1?1:0);
 CS2=(cs2?1:0);
  
 DI=1;
 RW=0;
 lcd_data_bus=disp_data;//写显示数据

 E=0;
 Delay(1);
 E=1; 
 E=0;
}

uchar Read_data(uchar cs1,uchar cs2)//read data from lcd
{
 unsigned char get_data;

 CS1=(cs1?1:0);
 CS2=(cs2?1:0);
  
 DI=1;
 RW=1;

 E=1;
 Delay(1);
 E=0;
 E=1;
 E=0; 
 get_data=lcd_data_bus;
  
 return get_data;

}

void Lcd_Init()   //初始化LCD屏

 
 RST=0;  //复位  如是上电复位就不用
 Delay(100);
 RST=1;
 Delay(100);
 Write_Command(Disp_Off,1,1);   //关显示
 Write_Command(Row_Add+0,1,1);
 Write_Command(Start_Line+0,1,1); //设置首行为起始行
 Write_Command(Col_Add+0,1,1);
 Write_Command(Disp_On,1,1);   //开显示
}

void Clr_Screen(void)

    uchar row,col;

 for(row=0;row<8;row++)
 {
  for(col=0;col<128;col++)
  { 
      lcd_row_col_data(row,col,0x00);
  }
 }
}
/*
void Full_Screen(void)

    uchar row,col;

 for(row=0;row<8;row++)
 {
  for(col=0;col<128;col++)
  { 
      lcd_row_col_data(row,col,0xFF);
  }
 } 
}
*/
uchar read_lcd_data(uchar row,uchar col)//新增函数 从lcd读取数据
{
 uchar get_data;
 Write_Command(Row_Add+row,1,1); 
 if(col<64)
 {  
  Write_Command(Col_Add+col,1,0);
  get_data=Read_Data(1,0);
 }
 else
 {
  Write_Command(Col_Add+col-64,0,1);
  get_data=Read_Data(0,1);
 } 
 return get_data;     
}

void lcd_dot_disp(uchar x,uchar y)//新增函数 以点形式显示x 0-127; y 0-63  左下角为坐标原点
{
 uchar byte_dot[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
 
 if(((x==127)&&(y==0))||(x==126)&&(y==0)||(x==125)&&(y==0)||(x==124)&&(y==0)) //避免显示小图标
  return;
                               
 Write_Command(Start_Line,1,1);
 
 if(y<8)
 {
  lcd_row_col_data(7,x,byte_dot[y]);
  return;
 }
 else if(y<16)
 {
  lcd_row_col_data(6,x,byte_dot[y-8]);
  return;
 }
 else if(y<24)
 {
  lcd_row_col_data(5,x,byte_dot[y-16]);
  return;
 }
 else if(y<32)
 {
  lcd_row_col_data(4,x,byte_dot[y-24]);
  return;
 }
 else if(y<40)
 {
  lcd_row_col_data(3,x,byte_dot[y-32]);
  return;
 }
 else if(y<48)
 {
  lcd_row_col_data(2,x,byte_dot[y-40]);
  return;
 }
 else if(y<56)
 {
  lcd_row_col_data(1,x,byte_dot[y-48]);
  return;
 }
 else if(y<64)
 {
  lcd_row_col_data(0,x,byte_dot[y-56]);
  return;
 }
}

推荐阅读

史海拾趣

AMSCO [Austria micro systems AG]公司的发展小趣事

Austria Micro Systems AG(AMS)是一家总部位于奥地利的半导体制造商,专注于模拟IC、传感器和感应器解决方案。以下是 AMS 公司发展的五个相关故事:

  1. 创立与初期发展:AMS 公司成立于1981年,最初是一家小型的半导体公司,成立之初主要从事晶圆制造和生产模拟集成电路(IC)。在公司创始人的领导下,AMS 迅速崛起,凭借着其创新能力和对技术的独特洞察力,迅速在半导体市场上占据了一席之地。

  2. 技术创新与产品扩展:随着时间的推移,AMS 公司不断进行技术创新,并不断扩展其产品线。公司致力于开发高性能、低功耗的模拟IC和传感器解决方案,以满足汽车、工业、医疗等各个领域的客户需求。AMS 的产品涵盖了光学传感器、环境传感器、声学传感器等多个领域。

  3. 全球化发展与市场拓展:AMS 公司通过不断拓展全球市场,加强与客户和合作伙伴的合作关系,实现了快速的业务增长。公司在欧洲、亚洲和美洲设立了多个销售办事处和生产基地,建立了完善的全球供应链和销售网络。公司的产品销售网络覆盖了全球范围,得到了国内外客户的广泛认可。

  4. 收购与合并:为了进一步壮大自身实力和拓展市场份额,AMS 公司通过收购和合并等方式不断强化自身。公司先后收购了一些技术领先的公司,扩大了产品线和市场份额。此举进一步提升了公司在模拟IC和传感器领域的竞争优势,加速了公司的业务增长。

  5. 持续创新与未来展望:AMS 公司将继续致力于技术创新和产品研发,不断提升产品性能和品质水平。公司将关注新兴技术和市场趋势,积极布局未来的发展方向,包括人工智能、物联网、汽车电子等领域。同时,公司还将加强与客户和合作伙伴的合作,共同推动行业的发展和进步。

Alpha Semiconductor公司的发展小趣事

随着技术的不断积累和市场的变化,Alpha Semiconductor于1988年开始为OEM厂家设计定制产品。这一转型是公司发展历程中的重要一步,它使得Alpha Semiconductor能够更深入地了解客户需求,提供更加贴合市场需求的产品解决方案。通过不断的创新和改进,Alpha Semiconductor逐渐在半导体市场中树立了良好的口碑。

ALLIED [Allied Electronics]公司的发展小趣事

Alpha Semiconductor位于美国加州硅谷的研发与生产基地是公司发展的重要支撑。在这里,公司拥有一流的研发团队和先进的生产设备,能够为客户提供高质量的产品和服务。硅谷作为全球科技创新的中心之一,为Alpha Semiconductor提供了丰富的技术资源和人才支持,使得公司能够不断推陈出新,保持在半导体行业的领先地位。

通过以上五个故事,我们可以看到Alpha Semiconductor公司在电子行业中的发展历程。从初创时期的代工服务起步,到后来的OEM定制产品、自主研发电源管理产品,再到高性能标准模拟和混合信号IC的制造实力,以及在美国硅谷的研发与生产基地的建立,每一个阶段都见证了公司的成长和进步。Alpha Semiconductor凭借着不断的技术创新和市场拓展,已经成为了半导体行业中的佼佼者。

Emmoco公司的发展小趣事

Emmoco公司成立于XXXX年,由一群富有远见和创新精神的电子工程师创立。公司自创立之初就明确了以技术创新为核心的发展道路,专注于研发高性能的电子元器件和模块。经过初期的不懈努力,Emmoco成功推出了一系列具有竞争力的产品,为公司的后续发展奠定了坚实的基础。

富信半导体(FOSAN)公司的发展小趣事

随着产品质量的不断提升和技术的不断创新,Emmoco开始积极拓展市场。公司制定了详细的市场拓展计划,通过参加国际展会、举办技术研讨会等方式,不断提高品牌知名度和影响力。同时,Emmoco还积极与国内外知名企业建立合作关系,共同开拓市场,实现互利共赢。这些举措使得Emmoco的市场份额不断扩大,品牌影响力逐渐增强。

Advance Tapes公司的发展小趣事

面对日益复杂的市场环境和客户需求,Advance Tapes公司积极寻求与其他企业的合作机会。通过与上游原材料供应商建立长期稳定的合作关系,确保了原材料的稳定供应和质量保障;通过与下游电子制造企业的深度合作,共同开发定制化胶带产品,满足了客户的特殊需求。这些合作不仅提升了Advance Tapes的市场竞争力,也促进了整个电子产业链的健康发展。

问答坊 | AI 解惑

ALTERA FPGA在微处理器系统中的在应用配置

摘要: ALTERA公司SRAM工艺可编程器件应用广泛,专用配置器件比较昂贵。在具有微处理器的系统中,使用微处理器系统的存储器来存储配置数据,并通过微处理器配置FPGA,这种方法几乎不增加成本。微处理器根据不同的程序应用,采用不同的配置数据对FPG ...…

查看全部问答>

单片机Mp3

小弟刚刚完成一个比较傻瓜的Mp3播放器。功能支持 按键(上一首 下一首)显示模块没有做。最大可以解码 位速160Kbps的Mp3文件。FAT32文件系统格式,读取SD卡。解码芯片是VS1003B 主控芯片用了STC的5A60S2 主频20M .用Uart显示播放信息。嘿嘿 上图献 ...…

查看全部问答>

弱弱的问下

KITL一般用来调试什么  怎么用 谢谢 !小弟我刚入门 呵呵 很想知道这干什么用的 谢谢!…

查看全部问答>

6个盘片有几个磁头?怎样计算

遇到一个问题, 某硬盘盘片由6片组成,则 他的磁头数为多少? 有人说是11个,不知道对不对. 告诉我怎么计算的. 百度上搜的 2片的话只要3个磁头就行了,我理解的是两个盘片靠着的的那面公用一个磁头,如果是我想的这样的话,为什么6片使用11个那?不知道 ...…

查看全部问答>

电容充放电的问题

我想实现电路导通的时候led逐渐点亮 断开的时候逐渐熄灭 现在这个电路逐渐点亮可以 但是逐渐熄灭怎么实现啊?怎么确定R1、R2、C1的取值?谢谢…

查看全部问答>

伺服定位完成后一个脉冲跳动

运动控制器控制伺服电机,采用+/-10V模拟量控制方式,在伺服定位完成后,出现+/-1个脉冲的跳动。比如,定位到100脉冲处,定位完成时编码器反馈到达了100位置,但编码器读数是100 ,101之间来回跳动,从机械上也出来了异常声音。试着调整速度环增益 ...…

查看全部问答>

编程胆怯心里交流

刚刚和辛昕还有DelusI0n交流了一下编程的经历,原来大家都有编程的胆怯心理,因此产生了共鸣,于是发个帖子大家交流一下,原来我都是自己闷着不说,怕说出来大家笑话,所以进步很慢。今天终于把我很长时间的心里话说出来了,可能也说出了大家的心声 ...…

查看全部问答>

推荐一本学习VHDL的书--《基于VHDL的FPGA和Nios II实例精炼》

推荐一本学习VHDL的书(包括FPGA与NIOS II设计)--《基于VHDL的FPGA和Nios II实例精炼》 《基于VHDL的FPGA和Nios II实例精炼》 由北航出版社出版。内容简介《基于VHDL的FPGA和NiosⅡ实例精炼》一书分为4个部分:Quartus Ⅱ软件的基本操作、VHDL语 ...…

查看全部问答>