求单片机MSP430G2452程序汇编,在华凌空调OLED WEH000802A(8字x2行)显示器上显示指定数字

查看: 3486|回复: 3
求iar 5.51.1的破解LICENSE,并送上刚调试好的0.96寸OLED程序+MSP430
马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!
才可以下载或查看,没有帐号?
本帖最后由 @杰@ 于
17:53 编辑
QQ截图35.jpg (35.78 KB, 下载次数: 28)
17:49 上传
程序是移植的,糅合了坛子里的12864和正点原子的STM32程序
#include &msp430x14x.h&
#include&font.h&
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//-----------------OLED端口定义----------------&&
#define OLED_CMD&&0& && &&&//写命令
#define OLED_DATA 1& && &&&//写数据
#define OLED_CS_Clr()&&P1OUT&=~BIT7
#define OLED_CS_Set()&&P1OUT|=BIT7
#define OLED_RST_Clr() P1OUT&=~BIT6
#define OLED_RST_Set() P1OUT|=BIT6
#define OLED_RS_Clr() P2OUT&=~BIT5
#define OLED_RS_Set() P2OUT|=BIT5
#define OLED_WR_Clr() P2OUT&=~BIT4
#define OLED_WR_Set() P2OUT|=BIT4
#define OLED_RD_Clr() P2OUT&=~BIT3
#define OLED_RD_Set() P2OUT|=BIT3
#define DataPort& && &P3OUT& && && && && &&&//P3口为数据口
uchar OLED_GRAM[128][8];
void WDT_Init(void);
void Clock_Init(void);
void Port_init(void);
void oledinit(void);
void OLED_Clear(void);
void OLED_Display_Off(void);
void OLED_Display_On(void);
void OLED_DrawPoint(uchar x,uchar y,uchar t);
void OLED_Fill(uchar x1,uchar y1,uchar x2,uchar y2,uchar dot);
ulint oled_pow(uchar m,uchar n);
void OLED_Refresh_Gram(void);
void OLED_ShowChar(uchar x,uchar y,uchar chr,uchar size,uchar mode);
void OLED_ShowNum(uchar x,uchar y,ulint num,uchar len,uchar size);
void OLED_ShowString(uchar x,uchar y,const uchar *p);
void OLED_WR_Byte(uchar dat,uchar cmd);
/****************主函数****************/
void main(void)
{
&&WDT_Init();
&&Clock_Init();
&&Port_init();
&&delay_ms(100);
&&oledinit();
& && && &
&&OLED_ShowString(0,0, &0.96' OLED TEST&);&&
&&OLED_ShowString(0,16,&&);&&
&&OLED_ShowString(0,32,&&);&&
&&OLED_ShowString(0,48,&ASCII:&);&&
&&OLED_ShowString(63,48,&CODE:&);&&
&&OLED_Refresh_Gram();& && && &
&&while(1)
&&}& && && &
//*************************************************************************
//& && && && &&&MSP430内部看门狗初始化
//*************************************************************************
void WDT_Init(void)
{
& &WDTCTL = WDTPW + WDTHOLD;& && & //关闭看门狗
}
//*************************************************************************
//& && && && && && &&&系统时钟初始化
//*************************************************************************
void Clock_Init(void)
{
&&
&&BCSCTL1&=~XT2OFF;& && && && && &&&//打开XT振荡器
&&BCSCTL2|=SELM1+SELS;& && && && &&&//MCLK为8MHZ,SMCLK为8MHZ
&&do{
& & IFG1&=~OFIFG;& && && && && && & //清除震荡标志
& & for(i=0;i&100;i++)
& && & _NOP();& && && && && && && & //延时等待
&&}
&&while((IFG1&OFIFG)!=0);& && && &&&//如果标志为1,则继续循环等待
&&IFG1&=~OFIFG;
//*************************************************************************
//& && && && && && && && &初始化IO口子程序
//*************************************************************************
void Port_init(void)
{
&&P1SEL&=0x3F;
&&P1DIR|=0xC0;
&&//P1OUT&=0x3F;
&&P2SEL&=0xC7;
&&P2DIR|=0x38;
&&//P2OUT&=0xC7;
&&P3SEL&=0x00;
&&P3DIR|=0xFF;
&&//P3OUT&=0x00;& &
}
/*************LCD初始化函数************/
void oledinit(void)
{
& && &&&OLED_RST_Clr();
& && &&&delay_ms(100);
& && &&&OLED_RST_Set();
& && && && && && && && && && && && && && &
& && &&&OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
& && &&&OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
& && &&&OLED_WR_Byte(80,OLED_CMD);& &//[3:0],分频因子;[7:4],震荡频率
& && &&&OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
& && &&&OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
& && &&&OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
& && &&&OLED_WR_Byte(0X00,OLED_CMD); //默认为0
& && &&&OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
& && &&&OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
& && &&&OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
& && &&&OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
& && &&&OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
& && &&&OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0-&0;1,0-&127;
& && &&&OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]-&COM0;N:驱动路数
& && &&&OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
& && &&&OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
& && && && && &&&
& && &&&OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
& && &&&OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
& && &&&OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
& && &&&OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
& && &&&OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
& && &&&OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*001,0.77*011,0.83*
& && &&&OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
& && &&&OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示& && && && && && && && && && && && && && && && && && && && && &
& && &&&OLED_WR_Byte(0xAF,OLED_CMD); //开启显示& && && &
& && &&&OLED_Clear();
}
//开启OLED显示& &
void OLED_Display_On(void)
{
& && &&&OLED_WR_Byte(0X8D,OLED_CMD);&&//SET DCDC命令
& && &&&OLED_WR_Byte(0X14,OLED_CMD);&&//DCDC ON
& && &&&OLED_WR_Byte(0XAF,OLED_CMD);&&//DISPLAY ON
}
//关闭OLED显示& &&&
void OLED_Display_Off(void)
{
& && &&&OLED_WR_Byte(0X8D,OLED_CMD);&&//SET DCDC命令
& && &&&OLED_WR_Byte(0X10,OLED_CMD);&&//DCDC OFF
& && &&&OLED_WR_Byte(0XAE,OLED_CMD);&&//DISPLAY OFF
}& && &&&
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!& && && &
void OLED_Clear(void)&&
{&&
& && &&&uchar i,n;&&
& && &&&for(i=0;i&8;i++)for(n=0;n&128;n++)OLED_GRAM[n][i]=0X00;&&
& && &&&OLED_Refresh_Gram();//更新显示
}
//更新显存到OLED& && && && && &&&
void OLED_Refresh_Gram(void)
{
& && &&&uchar i,n;& && && && && && &&&
& && &&&for(i=0;i&8;i++)&&
& && &&&{&&
& && && && && & OLED_WR_Byte (0xb0+i,OLED_CMD);& & //设置页地址(0~7)
& && && && && & OLED_WR_Byte (0x00,OLED_CMD);& && &//设置显示位置—列低地址
& && && && && & OLED_WR_Byte (0x10,OLED_CMD);& && &//设置显示位置—列高地址& &
& && && && && & for(n=0;n&128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
& && &&&}& &
}
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(uchar dat,uchar cmd)
{
& && &&&DataPort =& && && && &
& && &&&if(cmd)
& && && & OLED_RS_Set();
& && &&&else
& && && & OLED_RS_Clr();& && && && && && &
& && &&&OLED_CS_Clr();
& && &&&OLED_WR_Clr();& && && &
& && &&&OLED_WR_Set();
& && &&&OLED_CS_Set();& && && &
& && &&&OLED_RS_Set();& && && &
}& && && &
//x:0~127
//y:0~63
//t:1 填充 0,清空& && && && && && && && && && && &&&
void OLED_DrawPoint(uchar x,uchar y,uchar t)
{
& && &&&uchar pos,bx,temp=0;
& && &&&if(x&127||y&63)//超出范围了.
& && &&&pos=7-y/8;
& && &&&bx=y%8;
& && &&&temp=1&&(7-bx);
& && &&&if(t)OLED_GRAM[x][pos]|=
& && &&&else OLED_GRAM[x][pos]&=~& && && && &
}
//x1,y1,x2,y2 填充区域的对角坐标
//确保x1&=x2;y1&=y2 0&=x1&=127 0&=y1&=63& && && && && && &
//dot:0,清空;1,填充& && && &
void OLED_Fill(uchar x1,uchar y1,uchar x2,uchar y2,uchar dot)&&
{&&
& && &&&uchar x,y;&&
& && &&&for(x=x1;x&=x2;x++)
& && &&&{
& && && && && & for(y=y1;y&=y2;y++)OLED_DrawPoint(x,y,dot);
& && &&&}& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
& && &&&OLED_Refresh_Gram();//更新显示
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示& && && && && && && && && && && &
//size:选择字体 16/12
void OLED_ShowChar(uchar x,uchar y,uchar chr,uchar size,uchar mode)
{& && && && && && && && && && && &
& && &&&uchar temp,t,t1;
& && &&&uchar y0=y;
& && &&&chr=chr-' ';//得到偏移后的值& && && && && && && && && && && &&&
& & for(t=0;t&t++)
& & {& &
& && && && && & if(size==12)temp=oled_asc2_1206[chr][t];&&//调用1206字体
& && && && && & else temp=oled_asc2_1608[chr][t];& && && && && &&&//调用1608字体& && && && && && && && && && && &&&
& && &&&for(t1=0;t1&8;t1++)
& && && && && & {
& && && && && && && && &if(temp&0x80)OLED_DrawPoint(x,y,mode);
& && && && && && && && &else OLED_DrawPoint(x,y,!mode);
& && && && && && && && &temp&&=1;
& && && && && && && && &y++;
& && && && && && && && &if((y-y0)==size)
& && && && && && && && &{
& && && && && && && && && && &&&y=y0;
& && && && && && && && && && &&&x++;
& && && && && && && && && && &&&
& && && && && && && && &}
& && && && && & }& && && &&&
& & }& && && &
//m^n函数
ulint oled_pow(uchar m,uchar n)
{
& && &&&ulint result=1;& && && &
& && &&&while(n--)result*=m;& &
& && &&&
}& && && && && &
& && && && && && && && &&&
//显示2个数字
//x,y :起点坐标& && && &
//len :数字的位数
//size:字体大小
//mode:模式& && &&&0,填充模式;1,叠加模式
//num:数值(0~);& && && && && && && && && &
void OLED_ShowNum(uchar x,uchar y,ulint num,uchar len,uchar size)
{& && && && && &&&
& && &&&uchar t,
& && &&&uchar enshow=0;& && && && && && && && && && && && && && && && && &
& && &&&for(t=0;t&t++)
& && &&&{
& && && && && & temp=(num/oled_pow(10,len-t-1))%10;
& && && && && & if(enshow==0&&t&(len-1))
& && && && && & {
& && && && && && && && &if(temp==0)
& && && && && && && && &{
& && && && && && && && && && &&&OLED_ShowChar(x+(size/2)*t,y,' ',size,1);
& && && && && && && && && && &&&
& && && && && && && && &}else enshow=1;
& && && && && && && && &&&
& && && && && & }
& && && && && &&&OLED_ShowChar(x+(size/2)*t,y,temp+'0',size,1);
& && &&&}
}
//显示字符串
//x,y:起点坐标&&
//*p:字符串起始地址
//用16字体
void OLED_ShowString(uchar x,uchar y,const uchar *p)
{
#define MAX_CHAR_POSX 122
#define MAX_CHAR_POSY 58& && && &
& & while(*p!='\0')
& & {& && &
& && &&&if(x&MAX_CHAR_POSX){x=0;y+=16;}
& && &&&if(y&MAX_CHAR_POSY){y=x=0;OLED_Clear();}
& && &&&OLED_ShowChar(x,y,*p,16,1);& && && &
& && &&&x+=8;
& && &&&p++;
& & }&&
}& && && &
复制代码
OLED原理图以及和单片机接口定义
QQ截图20.jpg (75.83 KB, 下载次数: 11)
17:52 上传
QQ截图31.jpg (100.72 KB, 下载次数: 3)
17:52 上传
哇哦!楼主是好人!谢谢分享!
坛子里貌似有iar for msp430,你可以搜索一下!
地址:辽宁省大连市高新园区火炬路7号17层 QQ:
Copyright (C)
All Rights Reserved.

我要回帖

更多关于 000802 的文章

 

随机推荐