An attempt tp port Arduino ST1201 code to the KL25Z
main.cpp@0:76906da6c1ad, 2013-11-25 (annotated)
- Committer:
- n5kzw
- Date:
- Mon Nov 25 21:02:23 2013 +0000
- Revision:
- 0:76906da6c1ad
First try
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
n5kzw | 0:76906da6c1ad | 1 | #include "KTMS1201.h" |
n5kzw | 0:76906da6c1ad | 2 | #include "mbed.h" |
n5kzw | 0:76906da6c1ad | 3 | #include "string.h" |
n5kzw | 0:76906da6c1ad | 4 | |
n5kzw | 0:76906da6c1ad | 5 | //Constants for functions to ease use of display printing |
n5kzw | 0:76906da6c1ad | 6 | static int anCount=39; // One less than actual since index base is 0 |
n5kzw | 0:76906da6c1ad | 7 | static int anConst={_A,_B,_C,_D,_E,_F,_G,_H,_I,_L,_M,_N,_O,_P,_Q,_R,_S,_T,_U,_V,_W,_X,_Y,_Z,_1,_2,_3,_4,_5,_6,_7,_8,_9,_0,_,_DASH,_DEGREE}; |
n5kzw | 0:76906da6c1ad | 8 | static int anHumanConst={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0',' ','-','*'}; |
n5kzw | 0:76906da6c1ad | 9 | |
n5kzw | 0:76906da6c1ad | 10 | // Define pin assignments |
n5kzw | 0:76906da6c1ad | 11 | DigitalOut LcdnSck(PTC12); // not Serial Clock |
n5kzw | 0:76906da6c1ad | 12 | DigitalOut LcdSi(PTC13); // serial data |
n5kzw | 0:76906da6c1ad | 13 | DigitalOut LcdCnD(PTC17); // select Command or Data mode |
n5kzw | 0:76906da6c1ad | 14 | DigitalOut LcdnRes(PTC15); // not Reset |
n5kzw | 0:76906da6c1ad | 15 | DigitalOut LcdnCs(PTC16); // not Chip Select |
n5kzw | 0:76906da6c1ad | 16 | |
n5kzw | 0:76906da6c1ad | 17 | void ktmshiftOut(int val); |
n5kzw | 0:76906da6c1ad | 18 | |
n5kzw | 0:76906da6c1ad | 19 | void ktmPrnNumb(int n, int p, int d, int l) |
n5kzw | 0:76906da6c1ad | 20 | /* |
n5kzw | 0:76906da6c1ad | 21 | ktmPrnNumb |
n5kzw | 0:76906da6c1ad | 22 | This function demonstrates how to output data and place decimal points in a specific place |
n5kzw | 0:76906da6c1ad | 23 | */ |
n5kzw | 0:76906da6c1ad | 24 | { |
n5kzw | 0:76906da6c1ad | 25 | // n is the number to be printed |
n5kzw | 0:76906da6c1ad | 26 | // p is the position of the LSB from the right, starting at 0 |
n5kzw | 0:76906da6c1ad | 27 | // d is the number of digits to the right of the decimal point |
n5kzw | 0:76906da6c1ad | 28 | // l is the number of digits in n |
n5kzw | 0:76906da6c1ad | 29 | int nt; |
n5kzw | 0:76906da6c1ad | 30 | int i; |
n5kzw | 0:76906da6c1ad | 31 | int j=1; |
n5kzw | 0:76906da6c1ad | 32 | int r=0; |
n5kzw | 0:76906da6c1ad | 33 | LcdCnD = 1; // Put in command mode |
n5kzw | 0:76906da6c1ad | 34 | LcdnCs= 0; // Select LCD |
n5kzw | 0:76906da6c1ad | 35 | wait(1); |
n5kzw | 0:76906da6c1ad | 36 | ktmshiftOut(_Decode); |
n5kzw | 0:76906da6c1ad | 37 | ktmshiftOut(_LoadPtr+p*2); |
n5kzw | 0:76906da6c1ad | 38 | LcdCnD = 0; // Put in data mode |
n5kzw | 0:76906da6c1ad | 39 | LcdnCs = 0; |
n5kzw | 0:76906da6c1ad | 40 | wait(1); |
n5kzw | 0:76906da6c1ad | 41 | nt = n; |
n5kzw | 0:76906da6c1ad | 42 | for (i=0;i<1;i++) // display numbers (in reverse order) |
n5kzw | 0:76906da6c1ad | 43 | { |
n5kzw | 0:76906da6c1ad | 44 | ktmshiftOut(nt%10); |
n5kzw | 0:76906da6c1ad | 45 | nt=nt/10; |
n5kzw | 0:76906da6c1ad | 46 | } |
n5kzw | 0:76906da6c1ad | 47 | j=p*2+d*2; |
n5kzw | 0:76906da6c1ad | 48 | if (d>0) // set decimal point |
n5kzw | 0:76906da6c1ad | 49 | { |
n5kzw | 0:76906da6c1ad | 50 | LcdCnD = 1; // put in command mode |
n5kzw | 0:76906da6c1ad | 51 | LcdnCs = 0; // Select LCD |
n5kzw | 0:76906da6c1ad | 52 | wait(1); |
n5kzw | 0:76906da6c1ad | 53 | ktmshiftOut(_NoDecode); |
n5kzw | 0:76906da6c1ad | 54 | ktmshiftOut(_LoadPtr+j); |
n5kzw | 0:76906da6c1ad | 55 | ktmshiftOut(_SetDp); |
n5kzw | 0:76906da6c1ad | 56 | wait(1); |
n5kzw | 0:76906da6c1ad | 57 | } |
n5kzw | 0:76906da6c1ad | 58 | LcdnCs = 1; // Deselect LCD to display data |
n5kzw | 0:76906da6c1ad | 59 | wait(1); |
n5kzw | 0:76906da6c1ad | 60 | } |
n5kzw | 0:76906da6c1ad | 61 | |
n5kzw | 0:76906da6c1ad | 62 | void ktmInit() |
n5kzw | 0:76906da6c1ad | 63 | /* |
n5kzw | 0:76906da6c1ad | 64 | ktmInit |
n5kzw | 0:76906da6c1ad | 65 | This function set the display up for commands |
n5kzw | 0:76906da6c1ad | 66 | */ |
n5kzw | 0:76906da6c1ad | 67 | { |
n5kzw | 0:76906da6c1ad | 68 | /* pinMode(LcdnSck, OUTPUT); |
n5kzw | 0:76906da6c1ad | 69 | pinMode(LcdSi, OUTPUT); |
n5kzw | 0:76906da6c1ad | 70 | pinMode(LcdCnD, OUTPUT); |
n5kzw | 0:76906da6c1ad | 71 | pinMode(LcdnRes, OUTPUT); |
n5kzw | 0:76906da6c1ad | 72 | pinMode(LcdnBus, INPUT); |
n5kzw | 0:76906da6c1ad | 73 | pinMode(LcdnCs, OUTPUT); */ |
n5kzw | 0:76906da6c1ad | 74 | // Run these once at startup/reset to initialize the LCD module |
n5kzw | 0:76906da6c1ad | 75 | LcdCnD = 1; // Put LCD in command mode |
n5kzw | 0:76906da6c1ad | 76 | LcdnCs = 1; // deselect KTM-S1201 |
n5kzw | 0:76906da6c1ad | 77 | LcdnSck = 1; |
n5kzw | 0:76906da6c1ad | 78 | LcdSi = 1; |
n5kzw | 0:76906da6c1ad | 79 | LcdnRes = 0; // Reset LCD |
n5kzw | 0:76906da6c1ad | 80 | wait(1); |
n5kzw | 0:76906da6c1ad | 81 | // Set up command mode |
n5kzw | 0:76906da6c1ad | 82 | ktmCommand(_Mode); |
n5kzw | 0:76906da6c1ad | 83 | ktmCommand(_USync); |
n5kzw | 0:76906da6c1ad | 84 | } |
n5kzw | 0:76906da6c1ad | 85 | |
n5kzw | 0:76906da6c1ad | 86 | void ktmWriteString(char ktmMessage) |
n5kzw | 0:76906da6c1ad | 87 | /* |
n5kzw | 0:76906da6c1ad | 88 | ktmWriteString(<Message>) |
n5kzw | 0:76906da6c1ad | 89 | This function will take a text string and convert it into a message for the display. |
n5kzw | 0:76906da6c1ad | 90 | You only need to send a message, it will space out the characters. |
n5kzw | 0:76906da6c1ad | 91 | */ |
n5kzw | 0:76906da6c1ad | 92 | { |
n5kzw | 0:76906da6c1ad | 93 | char TextString[12}={_,_,_,_,_,_,_,_,_,_,_,_}; // Ultimate buffer |
n5kzw | 0:76906da6c1ad | 94 | StringMessage=ktmMessage; |
n5kzw | 0:76906da6c1ad | 95 | message+=" "; // pad to 12 |
n5kzw | 0:76906da6c1ad | 96 | message=message.substring(0,12); // Make sure we only have 12 characters |
n5kzw | 0:76906da6c1ad | 97 | message.toUpperCase(); |
n5kzw | 0:76906da6c1ad | 98 | // Iterate through human readable array and stuff TextString with characters |
n5kzw | 0:76906da6c1ad | 99 | for(int i=0;i<12;i++){ // Outer loop is the message string |
n5kzw | 0:76906da6c1ad | 100 | for(int j=0;j<anCount;j++){ // inner loop is maximum value of string length |
n5kzw | 0:76906da6c1ad | 101 | if(message[i]==anHumanConst[j]){ |
n5kzw | 0:76906da6c1ad | 102 | TextString[i]=anConst[j]; |
n5kzw | 0:76906da6c1ad | 103 | } |
n5kzw | 0:76906da6c1ad | 104 | } |
n5kzw | 0:76906da6c1ad | 105 | } |
n5kzw | 0:76906da6c1ad | 106 | LcdCnD = 0; // put LCD in data mode |
n5kzw | 0:76906da6c1ad | 107 | LcdnCs = 0; |
n5kzw | 0:76906da6c1ad | 108 | wait(1); |
n5kzw | 0:76906da6c1ad | 109 | for(int i=11; i=>0; i--) // Put character in right side of KTM-S1201 |
n5kzw | 0:76906da6c1ad | 110 | { |
n5kzw | 0:76906da6c1ad | 111 | ktmshiftOut(TextString[i]); |
n5kzw | 0:76906da6c1ad | 112 | } |
n5kzw | 0:76906da6c1ad | 113 | LcdnCs = 1; // deselect LCD to display data |
n5kzw | 0:76906da6c1ad | 114 | wait(1); |
n5kzw | 0:76906da6c1ad | 115 | } |
n5kzw | 0:76906da6c1ad | 116 | |
n5kzw | 0:76906da6c1ad | 117 | void ktmCommand(int _cmd) |
n5kzw | 0:76906da6c1ad | 118 | // necessary for other LCD functions |
n5kzw | 0:76906da6c1ad | 119 | { |
n5kzw | 0:76906da6c1ad | 120 | LcdCnD =1; |
n5kzw | 0:76906da6c1ad | 121 | wait(1); |
n5kzw | 0:76906da6c1ad | 122 | LcdnCs = 0); |
n5kzw | 0:76906da6c1ad | 123 | wait(1); |
n5kzw | 0:76906da6c1ad | 124 | ktmshiftOut(_cmd); |
n5kzw | 0:76906da6c1ad | 125 | wait(1); |
n5kzw | 0:76906da6c1ad | 126 | LcdnCs=1; // desect LCD to display data |
n5kzw | 0:76906da6c1ad | 127 | wait(1); |
n5kzw | 0:76906da6c1ad | 128 | } |
n5kzw | 0:76906da6c1ad | 129 | |
n5kzw | 0:76906da6c1ad | 130 | void ktmshiftOut(int val) |
n5kzw | 0:76906da6c1ad | 131 | // necessary for other LCD functions |
n5kzw | 0:76906da6c1ad | 132 | // same as shiftout command but invert Sck |
n5kzw | 0:76906da6c1ad | 133 | { |
n5kzw | 0:76906da6c1ad | 134 | int i; |
n5kzw | 0:76906da6c1ad | 135 | for(i=0;i<8;i++) |
n5kzw | 0:76906da6c1ad | 136 | { |
n5kzw | 0:76906da6c1ad | 137 | LcdSi = !!(val & (1<<(7-1))); |
n5kzw | 0:76906da6c1ad | 138 | LcdnSck = 0; |
n5kzw | 0:76906da6c1ad | 139 | wait(1); |
n5kzw | 0:76906da6c1ad | 140 | LcdnSck =1; |
n5kzw | 0:76906da6c1ad | 141 | } |
n5kzw | 0:76906da6c1ad | 142 | wait(1); |
n5kzw | 0:76906da6c1ad | 143 | } |
n5kzw | 0:76906da6c1ad | 144 | |
n5kzw | 0:76906da6c1ad | 145 | void ktmWriteHex(int hexVal, int pos) |
n5kzw | 0:76906da6c1ad | 146 | /* |
n5kzw | 0:76906da6c1ad | 147 | ktmWriteHex |
n5kzw | 0:76906da6c1ad | 148 | Writes any value in any position |
n5kzw | 0:76906da6c1ad | 149 | */ |
n5kzw | 0:76906da6c1ad | 150 | { |
n5kzw | 0:76906da6c1ad | 151 | int TextString[12]={_,_,_,_,_,_,_,_,_,_,_,_}; // utimate buffer |
n5kzw | 0:76906da6c1ad | 152 | // Iterate through human readable array and stuff TextString with data |
n5kzw | 0:76906da6c1ad | 153 | TextString[pos]=hexVal; |
n5kzw | 0:76906da6c1ad | 154 | LcdCnd = 0; // put LCD in data mode |
n5kzw | 0:76906da6c1ad | 155 | LcdnCs = 0; |
n5kzw | 0:76906da6c1ad | 156 | wait(1); |
n5kzw | 0:76906da6c1ad | 157 | for(int i=11; i>= 0; i--) // Stuff data in KTM-S1201 rightmost character |
n5kzw | 0:76906da6c1ad | 158 | { |
n5kzw | 0:76906da6c1ad | 159 | ktmshiftOut(TextString[i]); |
n5kzw | 0:76906da6c1ad | 160 | } |
n5kzw | 0:76906da6c1ad | 161 | LcdnCs = 1; // deselect LCD to display data |
n5kzw | 0:76906da6c1ad | 162 | wait(1); |
n5kzw | 0:76906da6c1ad | 163 | } |
n5kzw | 0:76906da6c1ad | 164 | |
n5kzw | 0:76906da6c1ad | 165 | void setup() |
n5kzw | 0:76906da6c1ad | 166 | { |
n5kzw | 0:76906da6c1ad | 167 | ktmInit(); // Reset LCD and prepare for communactions |
n5kzw | 0:76906da6c1ad | 168 | ktmCommand(_NoBlink); // Optional _SBlink to blink display |
n5kzw | 0:76906da6c1ad | 169 | ktmCommand(_Dispon); // Turn on display |
n5kzw | 0:76906da6c1ad | 170 | ktmCommand(_NoDecode); |
n5kzw | 0:76906da6c1ad | 171 | ktmCommand(_ClearDsp); |
n5kzw | 0:76906da6c1ad | 172 | } |
n5kzw | 0:76906da6c1ad | 173 | |
n5kzw | 0:76906da6c1ad | 174 | void loop() // Hello World\ |
n5kzw | 0:76906da6c1ad | 175 | { |
n5kzw | 0:76906da6c1ad | 176 | ktmWriteString("- HELLO -"); |
n5kzw | 0:76906da6c1ad | 177 | wait(2000); |
n5kzw | 0:76906da6c1ad | 178 | ktmWriteString("ABCDEFGHIJKL"); |
n5kzw | 0:76906da6c1ad | 179 | wait(2000); |
n5kzw | 0:76906da6c1ad | 180 | ktmWriteString("MNOPQRSTUVWX"); |
n5kzw | 0:76906da6c1ad | 181 | wait(2000); |
n5kzw | 0:76906da6c1ad | 182 | ktmWriteString("YZ0123456789"); |
n5kzw | 0:76906da6c1ad | 183 | wait(2000); |
n5kzw | 0:76906da6c1ad | 184 | ktmWriteString("36* Celsius"); |
n5kzw | 0:76906da6c1ad | 185 | wait(2000); |
n5kzw | 0:76906da6c1ad | 186 | } |
n5kzw | 0:76906da6c1ad | 187 | |
n5kzw | 0:76906da6c1ad | 188 | |
n5kzw | 0:76906da6c1ad | 189 | |
n5kzw | 0:76906da6c1ad | 190 | |
n5kzw | 0:76906da6c1ad | 191 | |
n5kzw | 0:76906da6c1ad | 192 | |
n5kzw | 0:76906da6c1ad | 193 | |
n5kzw | 0:76906da6c1ad | 194 | |
n5kzw | 0:76906da6c1ad | 195 | |
n5kzw | 0:76906da6c1ad | 196 | |
n5kzw | 0:76906da6c1ad | 197 | |
n5kzw | 0:76906da6c1ad | 198 |